2013-07-01 97 views
9

我想匹配模式可能有多个模式的实例的字符串。我需要单独的每个实例。 re.findall()应该这样做,但我不知道我在做什么错。Python正则表达式匹配多次

pattern = re.compile('/review: (http://url.com/(\d+)\s?)+/', re.IGNORECASE) 
match = pattern.findall('this is the message. review: http://url.com/123 http://url.com/456') 

我需要 'http://url.com/123',并且http://url.com/456两个数123 & 456是match列表的不同的元件。

我也试过'/review: ((http://url.com/(\d+)\s?)+)/'作为模式,但没有运气。

+0

只是删除回顾:部分作为第二HTTP不会有之前的数值。 – abc123

+0

是的,但我需要那里,它是正则表达式的一部分。我不需要任何网址,只是字符串'审查:' – mavili

回答

12

使用此。您需要在捕获组之外放置“审核”以实现预期结果。

pattern = re.compile(r'(?:review:)?(http://url.com/(\d+))\s?', re.IGNORECASE) 

这使输出

>>> match = pattern.findall('this is the message. review: http://url.com/123 http://url.com/456') 
>>> match 
[('http://url.com/123', '123'), ('http://url.com/456', '456')] 
+0

那个工作,谢谢! '(?:review)'之后的'?'也很重要,因为它没有给我所有的匹配。 ;) – mavili

+0

不要忘记'导入re' – Rambatino

5

你在正则表达式中有额外的/。在Python中,模式应该只是一个字符串。例如而不是这样的:

pattern = re.compile('/review: (http://url.com/(\d+)\s?)+/', re.IGNORECASE) 

它应该是:

pattern = re.compile('review: (http://url.com/(\d+)\s?)+', re.IGNORECASE) 

而且通常在Python你实际使用 “原始” 的字符串是这样的:

pattern = re.compile(r'review: (http://url.com/(\d+)\s?)+', re.IGNORECASE) 

额外的R ON字符串的前面可以避免你必须做大量的反斜杠转义等。

0

使用两步法:首先得到每一个从“review:”复制到EOL,然后将其标记。

msg = 'this is the message. review: http://url.com/123 http://url.com/456' 

review_pattern = re.compile('.*review: (.*)$') 
urls = review_pattern.findall(msg)[0] 

url_pattern = re.compile("(http://url.com/(\d+))") 
url_pattern.findall(urls)