正则表达式分组捕获多个匹配

13 投票
4 回答
14440 浏览
提问于 2025-04-16 15:21

我有个关于正则表达式的小问题。
我想在Python中捕获多个相同的部分(我觉得这不只是Python的问题),但后面的捕获似乎会覆盖前面的。

在这个过于简单的例子中,我实际上是想把一个字符串拆分成多个部分:

x = 'abcdef'
r = re.compile('(\w){6}')
m = r.match(x)
m.groups()     # = ('f',) ?!?
我想得到 ('a', 'b', 'c', 'd', 'e', 'f'),但是因为正则表达式会覆盖后面的捕获,所以我只得到了 ('f',)

这就是正则表达式应该有的表现吗?有没有办法做到我想要的,而不需要把语法重复六遍?

提前谢谢!
安德鲁

4 个回答

3

要在一个给定的字符串中找到所有匹配的内容,可以使用 re.findall(regex, string) 这个方法。如果你想获取字符串中的每一个字母,你的正则表达式(regex)可以写成 '(\w){1}' 或者简单地用 '(\w)'

参考:

r = re.compile('(\w)')
l = re.findall(r, x)

l == ['a', 'b', 'c', 'd', 'e', 'f']
9

这个 regex 模块可以做到这一点。

> m = regex.match('(\w){6}', "abcdef")
> m.captures(1)
['a', 'b', 'c', 'd', 'e', 'f']

它也可以处理命名捕获:

> m = regex.match('(?P<letter>)\w)', "abcdef")
> m.capturesdict()
{'letter': ['a', 'b', 'c', 'd', 'e', 'f']}

regex 模块预计会取代 're' 模块 - 它可以直接替换,使用起来和 're' 一样,但功能和能力要多得多。

15

抱歉,你不能用分组来解决这个问题。每个分组只能匹配一次,我想所有的正则表达式都是这样工作的。一个可能的解决办法是试着使用findall()或者类似的函数。

r=re.compile(r'\w')
r.findall(x)
# 'a', 'b', 'c', 'd', 'e', 'f'

撰写回答