Son Eğik Çizgi'den Önce Dizenin Parçasını Çıkar

Şu anda üzerinde çalışmakta olduğum program, URL’leri bir web sitesinden alır ve bir listeye yerleştirir. Almak istediğim, URL’nin son bölümü.

Öyleyse, URL listemdeki ilk öğe "https://docs.python.org/3.4/tutorial/interpreter.html" ise, "tercümanından önceki her şeyi kaldırmak istiyorum .html ".

Bunun gerçekleşmesi için kullanabileceğim bir işlev, kütüphane veya regex var mı? Diğer Stack Overflow mesajlarına baktım ancak çözümler işe yaramadı.

Bunlar birkaç denememden ikisi:

for link in link_list:
   file_names.append(link.replace('/[^/]*$',''))
print(file_names)

&

for link in link_list:
   file_names.append(link.rpartition('//')[-1])
print(file_names)
3
Neden rpartition() öne eğik çizgi yerine ters eğik çizgi üzerinde bölmeyi deniyor?
katma yazar TigerhawkT3, kaynak
Şimdi, tek bir tane yerine bir çift eğik çizgi üzerinde ikiye bölünüyor (eğik çizginin çıkmasına gerek yok).
katma yazar TigerhawkT3, kaynak
Emin misiniz? 'https://docs.python.org/3.4/tutorial/interpreter.html'.rpar‌ tition ('/') [- 1] ' ı denedim ve 'döndürdü interpreter.html ' beklendiği gibi.
katma yazar TigerhawkT3, kaynak
Psişik güçlerim bana link_list öğelerinin öğelerinin düşündüğün gibi olmadığını söylüyor. Beklentilerinize uyup uymadıklarını kontrol etmek için onları yazdırmayı deneyin.
katma yazar TigerhawkT3, kaynak
Çalışmadıklarını nereden biliyorsun? Bir hata mesajı mı alıyorsun?
katma yazar Kevin, kaynak
@Kevin Çıkış doğru değil.
katma yazar freddiev4, kaynak
@ TigerhawkT3 Üzgünüz. Sadece tamir ettim
katma yazar freddiev4, kaynak
@ TigerhawkT3 Tek ve iki ileri eğik çizgi ile test ettim ve hala çalışmıyor. Aşağıdaki cevapların bazılarını şimdi test ediyorum.
katma yazar freddiev4, kaynak
@ TigerhawkT3 Evet. Eminim. Bazı nedenlerden dolayı programımda çalışmıyor. Bu garip...
katma yazar freddiev4, kaynak
@ TigerhawkT3 Hmm .. ben sadece her şeyi sildim ve düzenlemeniz ile yeniden yazdım. Şuan çalışıyor! Bu garip. Bunu kontrol edeceğim, çünkü daha önce işe yaramadı ...
katma yazar freddiev4, kaynak

6 cevap

str.rsplit .

>>> s = 'https://docs.python.org/3.4/tutorial/interpreter.html'
>>> s.rsplit('/',1)
['https://docs.python.org/3.4/tutorial', 'interpreter.html']
>>> s.rsplit('/',1)[1]
'interpreter.html'

Ve RegEx'i kullanmak

>>> re.search(r'(.*)/(.*)',s).group(2)
'interpreter.html'

Ardından, son / ile Dize'nin sonu arasında kalan 2. grubu eşleştirin. Bu RegEx'te açgözlü tekniğin açgözlü bir kullanımıdır.

Regular expression visualization

Debuggex Demo

Small Note - The problem with link.rpartition('//')[-1] in your code is that you are trying to match // and not /. So remove the extra / as in link.rpartition('/')[-1].

17
katma

rpartition() 'ı kullanabilirsiniz:

>>> s = 'https://docs.python.org/3.4/tutorial/interpreter.html'
>>> s.rpartition('/')
('https://docs.python.org/3.4/tutorial', '/', 'interpreter.html')

Ve döndürülen 3 element parçasının son kısmını alın:

>>> s.rpartition('/')[2]
'interpreter.html'
2
katma
Neden aşağıya sorabilirim?
katma yazar dawg, kaynak
Muhtemelen, / 'de bölmek, dize dosya yapısı sınırlayıcıları olarak ters eğik çizgiler kullanıyorsa işe yaramaz çünkü ... ama bu URL'ler için bir sorun değil, bu yüzden emin değilim.
katma yazar TigerhawkT3, kaynak
Eğer bir '\' ise, rpartition'ı kullanamazsınız ...
katma yazar the wolf, kaynak

Bu regex gerekmez.

import os

for link in link_list:
    file_names.append(os.path.basename(link))
2
katma

Regex kullanmayı planlıyorsanız, bu çalışması gerekir

 for link in link_list:
    file_names.append(link.replace('.*/',''))
 print(file_names)
0
katma

İşte bunu yapmanın daha genel, regex yolu:

    re.sub(r'^.+/([^/]+)$', r'\1', "http://test.org/3/files/interpreter.html")
    'interpreter.html'
0
katma

Sadece string.split kullanın:

url = "/some/url/with/a/file.html"

print url.split("/")[-1]

# Result should be "file.html"

split, "/" ile ayrılmış bir dizi dizgi verir. [-1], dizideki son öğeyi verir; bu istediğiniz şeyi verir.

0
katma