2017-10-13 4 views
1

Ich versuche, eine Teilzeichenfolge zu finden, die im Grunde eine Verknüpfung zu jeder Website ist. Die Idee ist, dass wenn ein Benutzer etwas postet, der Link extrahiert und einer Variablen namens web_link zugewiesen wird. Mein aktueller Code folgt:Verwenden von .find ("") Methode ohne letzte Zeichen schneiden, wenn die Teilzeichenfolge ganz am Ende ist

post = ("You should watch this video https://www.example.com if you have free time!") 
web_link = post[post.find("http" or "www"):post.find(" ", post.find("http" or "www"))] 

Der Code funktioniert perfekt, wenn es eine Leer nach der Linksetzung ist jedoch, wenn der Link in der Post am Ende ist. Zum Beispiel:

post = ("You should definitely watch this video https://www.example.com") 

Dann kann der post.find(" ") keine Leer/Leerzeichen finden und gibt -1, die in web_link führt "https://www.example.co"

Ich versuche, eine Lösung zu finden, die nicht eine if-Anweisung, wenn möglich mit sich bringt.

+0

Side Kommentar: 'if' ist keine Funktion. – Neo

+0

sollten Sie Regex verwenden, sonst wird Ihre Funktion nicht sehr robust sein ... eine einfache "Python Extract URL von String" Google-Suche würde Ihr Problem lösen – ifma

Antwort

0

Der Grund, warum dies nicht funktioniert, ist, weil, wenn die Zeichenfolge nicht gefunden wird und -1 zurückgegeben wird, die Slice-Befehle dies als "den Rest der Zeichenfolge -1 Zeichen vom Ende" interpretiert.

Wie ifma darauf hingewiesen hat, wäre der beste Weg, dies zu erreichen, mit einem regulären Ausdruck. Etwas wie:

re.search("(https?://|www[^\s]+)", post).group(0) 
+0

Dies beinhaltet keine Web-Links "www" starten. Wenn Sie eine Zeichenkette ohne "https" verwenden, erhalten Sie diesen Fehler: 'AttributeError: 'NoneType' -Objekt hat kein Attribut 'group'' – Alperen

+0

Ja, fair genug. Aktualisiert, um dies zu berücksichtigen. –

0

Verwenden Sie Regex. Ich habe ein wenig die Lösung geändert here.

import re 

def func(post): 
    return re.search("[(http|ftp|https)://]*([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\[email protected]?^=%&/~+#-])?", post).group(0) 

print(func("You should watch this video www.example.com if you have free time!")) 
print(func("You should watch this video https://www.example.com")) 

Ausgang:

www.example.com 
https://www.example.com 

Aber ich würde sagen, mit "if" einfacher und liegt auf der Hand:

def func(post): 
    start = post.find("http" or "www") 
    finish = post.find(" ", start) 
    return post[start:] if finish == -1 else post[start:finish] 
Verwandte Themen