我使用
re.compile(r"(.+?)\1+").findall('44442(2)2(2)44')
可以得到
['4','2(2)','4']
但是我该如何获取
['4444','2(2)2(2)','44']
通过使用正则表达式?谢谢。
re.findall
将返回一个组列表。要获取整个匹配项,请改用re.finditer,这样您就可以从每个实际匹配对象中提取完整的匹配项。pattern = re.compile(r"(.+?)\1+")
[match.group(0) for match in pattern.finditer('44442(2)2(2)44')]
不需要对OP的正则表达式做出太多修改:
[m[0] for m in re.compile(r"((.+?)\2+)").findall('44442(2)2(2)44')]
findall
函数如果没有分组,将返回完整匹配结果;如果有分组,则返回分组结果。因此,如果您的正则表达式需要分组才能工作,我们只需添加另一个组来包含完整��匹配,并在匹配后提取它即可。
你可以做:
[i[0] for i in re.findall(r'((\d)(?:[()]*\2*[()]*)*)', s)]
这里的正则表达式是:
((\d)(?:[()]*\2*[()]*)*)
这将输出一个包含两个捕获组的元组列表,我们只对第一个感兴趣,因此使用 i[0]
。
示例:
In [15]: s
Out[15]: '44442(2)2(2)44'
In [16]: [i[0] for i in re.findall(r'((\d)(?:[()]*\2*[()]*)*)', s)]
Out[16]: ['4444', '2(2)2(2)', '44']