要多次匹配的Python正则表达式

2024-04-28 05:35:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一个模式与可能有多个模式实例的字符串匹配。我需要每一个单独的实例。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/123http://url.com/456和123&456这两个数字作为match列表的不同元素。

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


Tags: 实例字符串recomhttpurlismatch
3条回答

使用两步方法:首先获取从“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)

用这个。您需要将“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')]

你在正则表达式中有多余的。在python中,模式应该只是一个字符串。e、 g.而不是这个:

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省去了很多反斜杠转义等操作

相关问题 更多 >