2017-12-13 2 views
-1

Ich habe einen String URL zu entfernen, könnte es beginnt mit http:// oder https:// oder ftp:// usw.finden und mehrere Muster für eine Zeichenfolge in Python

Zuerst muss ich prüfen, ob die Zeichenfolge in der Tat beginnt mit der Header mit url.startswith(header) dann Ich muss den Header entfernen. Wenn zum Beispiel die Eingabe http://example.com/example ist, prüft die Funktion, ob die URL mit http:// beginnt und example.com/example zurückgibt.

Also, wie Pythonic Code für diese Aufgabe schreiben (wollen Sie nicht wirklich eine for-Schleife verwenden)? Oder sollte ich einfach Regex verwenden?

+0

Go für regex. Es wird einfach sein, diese Art von Aufgabe mit Regex durchzuführen. – Sam

+0

Warum verwenden Sie nicht [urllib.parse] (https://docs.python.org/3/library/urllib.parse.html#module-urllib.parse) dafür? –

Antwort

1

Regex wäre ein bisschen zuviel des Guten sein, wenn das alles ist, Sie möchten, teilen Sie einfach Ihre Zeichenfolge auf :// und überprüfen, ob es mit jedem Ihrer genehmigten Protokollen beginnt:

uri = your_string.split("://", 1) 
if len(uri) > 1 and uri[0] in {"http", "https", "ftp"}: 
    print("Match: " + uri[1]) 
else: 
    print("No match!") 

Dies ist jedoch nicht Garantiere die Gültigkeit deines URIs. Wenn du denkst, dass dein String eine ungültige URL enthält, musst du etwas Komplexeres verwenden.

+0

Nur aus Neugier, warum verwenden Sie ein 'Set' für das Nachschlagen statt einer' Liste' oder 'Tupel'? – Szabolcs

+0

@Szabolcs - 'set' ist eine Hash-Tabelle, so dass O (1) im Durchschnitt Komplexität sucht. – zwer

+0

noch, wenn ich timeit verwende, um es mit 'list' oder' tuple' zu ​​vergleichen, bekomme ich viel bessere Ergebnisse für beide. – Szabolcs

1

Nach dem docs, könnten Sie str.startswith() ein tuple von Strings passieren zu testen:

str.startswith(prefix[, start[, end]])

Return True, wenn der String mit dem prefix beginnt, sonst False zurückzukehren. prefix kann auch ein Tupel von Präfixen sein, nach denen gesucht werden soll.

def get_url(url): 
    headers = ('http://', 'https://', 'ftp://') 
    if url.startswith(headers): 
     url = url[url.find('://')+3:] 
    return url 


http = 'http://example.com/example' 
https = 'https://example.com/example' 
ftp = 'ftp://example.com/example' 

print(get_url(http)) 
print(get_url(https)) 
print(get_url(ftp)) 

example.com/example 
example.com/example 
example.com/example 
>>> 
Verwandte Themen