2017-10-13 67 views
1

我想找到一個子字符串,它基本上是一個鏈接到任何網站。這個想法是,如果用戶發佈了一些內容,鏈接將被提取並分配給一個名爲web_link的變量。我現在的代碼如下:使用.find(「」)方法,而不削減最後一個字符,如果子字符串在最後

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"))] 

代碼工作完美,如果有鏈接後空格鍵,但是,如果門柱內側的鏈接是在最後。例如:

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

然後post.find(" ")不能找到一個空格/空白,並返回-1導致web_link "https://www.example.co"

我試圖找到可能的話不涉及的if語句的解決方案。

+0

邊評論:'if'不是一個函數。 – Neo

+0

你應該使用正則表達式,否則你的函數將不會非常強大...一個簡單的「從字符串提取網址」谷歌搜索將解決您的問題 – ifma

回答

0

這不起作用的原因是因爲如果未找到字符串並返回-1,則slice命令會將此解釋爲「字符串-1的其餘部分從末尾開始」。

正如ifma指出的那樣,最好的方法是使用正則表達式。例如:

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

這不包括網站鏈接開始「www」。實際上,如果你使用一個沒有「https」的字符串,你會得到這個錯誤:'AttributeError:'NoneType'對象沒有屬性'group'' – Alperen

+0

是非常公平的。經過更新以考慮到這一點。 –

0

使用正則表達式。我已經做了一些改變,解決方案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")) 

輸出:

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

但我應該說,使用「如果」是簡單而明顯的:

def func(post): 
    start = post.find("http" or "www") 
    finish = post.find(" ", start) 
    return post[start:] if finish == -1 else post[start:finish] 
相關問題