Python正则表达式匹配多次

时间:2013-07-01 15:05:04

标签: python regex multiple-matches

我正在尝试将模式与可能具有多个模式实例的字符串进行匹配。我需要单独的每个实例。 re.findall() 应该这样做,但我不知道我做错了什么。

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?)+)/'作为模式,但没有运气。

3 个答案:

答案 0 :(得分:14)

使用它。您需要在捕获组之外放置“审核”以获得所需的结果。

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

答案 1 :(得分:6)

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

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

应该是:

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

通常在python中你实际上使用的是" raw"像这样的字符串:

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

字符串前面的额外r可以让你不必进行大量的反斜杠转义等。

答案 2 :(得分:0)

采用两步法:首先从"审核中获取所有内容:"到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)