2017-06-16 212 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