快速正则表达问题。
我试图在python中捕获捕获组的多个实例(不要认为它是特定于python的),但后续捕获似乎覆盖了之前的捕获。
在这个过于简化的例子中,我基本上试图分割一个字符串:
x = 'abcdef' r = re.compile('(\w){6}') m = r.match(x) m.groups() # = ('f',) ?!?我想获得
('a', 'b', 'c', 'd', 'e', 'f')
,但由于正则表达式会覆盖后续捕获,因此我得到('f',)
这是正则表达式的表现吗?有没有办法做我想做的事情,而不必重复六次语法?
提前致谢!
安德鲁
答案 0 :(得分:14)
我担心你不能使用群组。每个组只能匹配一次,我相信所有的正则表达式都是这样的。一种可能的解决方案是尝试使用findall()或类似的。
r=re.compile(r'\w')
r.findall(x)
# 'a', 'b', 'c', 'd', 'e', 'f'
答案 1 :(得分:4)
The regex module can do this.
> m = regex.match('(\w){6}', "abcdef")
> m.captures(1)
['a', 'b', 'c', 'd', 'e', 'f']
Also works with named captures:
> m = regex.match('(?P<letter>)\w)', "abcdef")
> m.capturesdict()
{'letter': ['a', 'b', 'c', 'd', 'e', 'f']}
The regex module is expected to replace the 're' module - it is a drop-in replacement that acts identically, except it has many more features and capabilities.
答案 2 :(得分:2)
要查找给定字符串中的所有匹配项,请使用re.findall(regex, string)。此外,如果您想获取此处的每个字母,您的正则表达式应为'(\w){1}'
或'(\w)'
。
请参阅:
r = re.compile('(\w)')
l = re.findall(r, x)
l == ['a', 'b', 'c', 'd', 'e', 'f']
答案 3 :(得分: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']