正则表达式分组捕获多个匹配
我有个关于正则表达式的小问题。
我想在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'