Python re.findall 打印所有模式

Posted

技术标签:

【中文标题】Python re.findall 打印所有模式【英文标题】:Python re.findall print all patterns 【发布时间】:2013-07-02 07:04:38 【问题描述】:
>>> match = re.findall('a.*?a', 'a 1 a 2 a 3 a 4 a')
>>> match
['a 1 a', 'a 3 a']

如何打印出来

['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']

谢谢!

【问题讨论】:

【参考方案1】:

我认为使用积极的前瞻断言应该可以解决问题:

>>> re.findall('(?=(a.*?a))', 'a 1 a 2 a 3 a 4 a')
['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']

re.findall 返回正则表达式中的所有组 - 包括前瞻中的组。这是有效的,因为前瞻断言不消耗任何字符串。

【讨论】:

这是+1的方法【参考方案2】:
r = re.compile('a.*?a') # as we use it multiple times
matches = [r.match(s[i:]) for i in range(len(s))] # all matches, if found or not
matches = [m.group(0) for m in matches if m] # matching string if match is not None
print matches

给予

['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']

我不知道这是否是最好的解决方案,但在这里我测试每个到达字符串末尾的子字符串是否与给定的模式匹配。

【讨论】:

【参考方案3】:

您可以使用允许重叠匹配的替代regex 模块:

>>> regex.findall('a.*?a', 'a 1 a 2 a 3 a 4 a', overlapped = True)
['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']

【讨论】:

如果/当该模块替换默认的re 模块时会很好 @JonClements 是的!我会喜欢它。对于该模块提供的所有好处,它也得到了很好的支持。我发现了一个错误并报告给了模块开发人员。它在 24 小时内修复。 也搜索了它,但从不知道有一个比“re”更好的“regex”模块

以上是关于Python re.findall 打印所有模式的主要内容,如果未能解决你的问题,请参考以下文章

Python re.findall 将输出打印为列表而不是字符串

是否有 Python 的 re.findall/re.finditer(迭代正则表达式结果)的 Perl 等价物?

python 正则(re.compile()/re.findall())

python_day6_re模块补充

python)使用正则表达式查找所有匹配项(从 re.search 更改为 re.findall)[重复]

python正则表达式3-模式匹配