我正在尝试将模式与可能具有多个模式实例的字符串进行匹配。我需要单独的每个实例。 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?)+)/'
作为模式,但没有运气。
答案 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)