Python正则表达式分组:如何获取所有分组?

18

我对此感到困惑:

>>> import re
>>> re.match(r"(?P<all>-(?P<one>\w+))*","-ab-cde-fghi-jkl-mn").groups()
('-mn', 'mn')
>>> re.match(r"(?P<all>-(?P<one>\w+)*)","-ab-cde-fghi-jkl-mn").groups()
('-ab', 'ab')

我如何获取所有术语列表,最好像这样:

["ab","cde","fghi","jkl","mn"]

但是

"-ab-cde-fghi-jkl-mn"

也可以。

(请注意,我完全知道str.split("-")。这是一个关于re的问题 - 如何匹配整个集合)


1
match的文档表示:“如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象。” 因此只期望一个匹配,其中包含两个组。 - Mad Physicist
2
如果您使用PyPi正则表达式模块,可以通过.captures访问所有组。 - Wiktor Stribiżew
2个回答

25

使用re.findall()函数。

示例:

s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z]+', s)

输出:

['ab', 'cde', 'fghi', 'jkl', 'mn']

3

在.NET中,默认情况下它可以按照你的要求工作。

然而,Python并不支持这个功能。最接近的行为是在捕获的子字符串上重复匹配:

>>> match = re.match(r"(?P<all>(?:-(?P<one>\w+))*)","-ab-cde-fghi-jkl-mn")
>>> re.findall(r"-(?P<one>\w+)", match.group("all"))
['ab', 'cde', 'fghi', 'jkl', 'mn']

如果内部模式不是非常简单,那么可能会变得复杂。


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