使用正则表达式进行多个匹配的组捕获

13

一个简单的正则表达式问题。
我正在尝试在Python中捕获多个实例的捕获组(认为这不是具体针对Python的),但后续的捕获好像会覆盖之前的。

在这个过度简化的示例中,我基本上要拆分一个字符串:

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

这是正则表达式应该的行为吗?有没有一种方法可以在不必重复语法六次的情况下完成我想要的功能呢?

谢谢!
安德鲁


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

1
我不这么认为。对于这些问题,可以使用re.findall和re.split函数解决。 - Jochen Ritzel
可能是Python正则表达式多个组的重复问题。 - outis
1
这是一篇关于捕获重复组的好文章。 http://www.regular-expressions.info/captureall.html 示例:!abcabc123! 要捕获所有的abc和123,需要使用正则表达式!((?:(abc)|(123))+)!。请注意额外的括号。 - b0bi
4个回答

15

很抱歉,您无法使用组来完成此任务。每个组只能匹配一次,我认为所有正则表达式都是这样工作的。一种可能的解决方案是尝试使用findall()或类似方法。

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

1
咳嗽!踢罐子 为什么它不能按照我想要的方式完全做到我想要的!--谢谢!安德鲁 - Andrew Klofas
我一直在查找命令,同时浏览re.search re.match和返回的re.MatchObject - Robert Johnstone

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']}

正则表达式模块预计将替换 're' 模块 - 它是一个直接替换的模块,功能完全相同,但它具有更多的功能和能力。


3
要在给定的字符串中查找所有匹配项,请使用 re.findall(regex, string)。此外,如果您想要获取这里的每个字母,您的正则表达式应该是 '(\w){1}' 或者只是 '(\w)'
参见:
r = re.compile('(\w)')
l = re.findall(r, x)

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

1

我想你的问题是对你需求的简化表述。

那么,我举一个稍微复杂一点的例子:

import re

pat = re.compile('[UI][bd][ae]')

ch = 'UbaUdeIbaIbeIdaIdeUdeUdaUdeUbeIda'

print [mat.group() for mat in pat.finditer(ch)]

结果

['Uba', 'Ude', 'Iba', 'Ibe', 'Ida', 'Ide', 'Ude', 'Uda', 'Ude', 'Ube', 'Ida']

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