2017-06-16 217 views
3

如何識別文本中的.onion鏈接,記住它們可以以各種方式進入;用於識別文本中的.onion鏈接的方法?

hfajlhfjkdsflkdsja.onion 
http://hfajlhfjkdsflkdsja.onion 
http://www.hfajlhfjkdsflkdsja.onion 

我想正則表達式,但(.*?.onion)將返回全款,其中URL鏈接被埋葬在

+2

嘗試'\ S + \。洋蔥\ b'。但是,如果鏈接包含空格,這將無濟於事。 –

+2

你必須找到永遠在鏈接之前的東西,永遠不會出現在鏈接中。像@WiktorStribiżew建議的那樣,你可以使用空白字符。 – Szymon

+1

嗨@WiktorStribiżew我在這裏嘗試了這個正則表達式https://regex101.com/r/5ArhNJ/2它似乎並沒有捕獲它 – user3191569

回答

3

這將做到這一點:(?:https?://)?(?:www)?(\S*?\.onion)\b(由非捕獲組 - 信用:@WiktorStribiżew)

演示:

s = '''hfajlhfjkdsflkdsja.onion 
https://hfajlhfjkdsflkdsja.onion 
http://www.hfajlhfjkdsflkdsja.onion 
https://www.google.com 
https://stackoverflow.com''' 


for m in re.finditer(r'(?:https?://)?(?:www)?(\S*?\.onion)\b', s, re.M | re.IGNORECASE): 
    print(m.group(0)) 

輸出

hfajlhfjkdsflkdsja.onion 
https://hfajlhfjkdsflkdsja.onion 
http://www.hfajlhfjkdsflkdsja.onion 
+0

您可以使用'\ S'而不是'[^ \ s]'。 在開始時還使用'?'在這種情況下是無用的,並使正則表達式更復雜。 '(http(s)?://)?(www)?([^ \ s] *?\。洋蔥)'等於'\ S *?\。洋蔥' – Szymon

+0

@Szymon這將防止錯誤積極的像'大聲笑... imAn.onion'。 –

+1

不過,我同意,'\ S'比'^ \ s'更簡潔。 –

0

的方法沒有正則表達式:

url = 'http://hfajlhfjkdsflkdsja.onion' 
split = url.split('.onion') 
if len(split)==2 && len(split[1])==0: 
    %do something 
+1

如何處理「這是一個鏈接:blahblah.onion」?它會分成「這是一個鏈接:blahblah」。 –

+1

它會將它分成['這是一個鏈接:blahblak',''],然後你輸入if結構。 – SeaMonkey

+0

儘管OP想要「blahblah」部分。不是其餘的。 –

0

方便快捷:

([^\s]+\.onion)

比賽從第一空間,直到 「.onion」 開始的所有字符。

+1

1.無需將整個正則表達式放在'()'中,因爲它是已經是一個組(0)。 2.而不是'[^ \ s]'使用\ S。它會匹配'www.onion.com'上的'www.onion' – Szymon