Python正则表达式匹配多个实例

22

我正在尝试针对可能有多个模式实例的字符串匹配模式。我需要分别获得每个实例。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?)+)/',但没有成功。


仅返回翻译的文本:只需删除“review:”部分,第二个http之前不会有它。 - abc123
是的,但是我需要那个在那里,它是正则表达式的一部分。我不需要任何 URL 在那里,只需要跟随字符串“review:”的那些。 - mavili
3个回答

26

使用这个。您需要将“review”放在捕获组之外,以实现所需的结果。

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

做到了,谢谢!在 (?:review ) 后面加上 ? 也很关键,如果没有它,就无法匹配所有内容。 ;) - mavili
不要忘记 import re - Rambatino
不用“findall”怎么样?也就是说,当您需要匹配多个案例时,但这只是匹配的一部分时怎么办? - user2340939
https://regex101.com/ 是一个很棒的工具,用于测试这个功能。 - undefined

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中,你会使用类似这样的“原始”字符串:
```python ```
pattern = re.compile(r'review: (http://url.com/(\d+)\s?)+', re.IGNORECASE)

字符串前面额外的 r 可以省去大量反斜杠转义等操作。


2

采用两步方法:首先获取从“review:”到行尾的所有内容,然后对其进行标记化处理。

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接