1

我有一个正则表达式,它在某些文本中查找 url,例如:

my_urlfinder = re.compile(r'\shttp:\/\/(\S+.|)blah.com/users/(\d+)(\/|)')
text = "blah blah http://blah.com/users/123 blah blah http://blah.com/users/353"

for match in my_urlfinder.findall(text):
    print match  #prints an array with all the individual parts of the regex 

如何获取整个网址?目前匹配只打印出匹配的部分(我需要其他东西)......但我也想要完整的网址。

4

2 回答 2

2

您应该使您的组不被捕获:

my_urlfinder = re.compile(r'\shttp:\/\/(?:\S+.|)blah.com/users/(?:\d+)(?:\/|)')

findall() 当有捕获组时改变行为。使用组,它只会返回组,而不捕获组,而是返回整个匹配的文本。

演示:

>>> text = "blah blah http://blah.com/users/123 blah blah http://blah.com/users/353"
>>> my_urlfinder = re.compile(r'\shttp:\/\/(?:\S+.|)blah.com/users/(?:\d+)(?:\/|)')
>>> for match in my_urlfinder.findall(text):
...     print match
... 
 http://blah.com/users/123
 http://blah.com/users/353
于 2013-03-06T14:36:57.797 回答
1

不使用任何捕获组的替代方法是在所有内容周围添加另一个:

my_urlfinder = re.compile(r'\s(http:\/\/(\S+.|)blah.com/users/(\d+)(\/|))')

这将允许您在保留整个结果的同时保留内部捕获组。

对于演示文本,它将产生以下结果:

('http://blah.com/users/123', '', '123', '')
('http://blah.com/users/353', '', '353', '')

作为旁注,请注意当前表达式需要在 URL前面有一个空格,因此如果文本以一个不匹配的开头。

于 2013-03-06T14:39:26.677 回答