我用
re.compile(r"(.+?)\1+").findall('44442(2)2(2)44')
可以获得
['4','2(2)','4']
,但我怎么能
['4444','2(2)2(2)','44']
使用正则表达式?
由于
答案 0 :(得分:4)
不需要更改您的模式。只需要使用正确的功能来完成工作。如果模式中有捕获组,re.findall
将返回组列表。要获得整个匹配,请使用re.finditer,以便您可以从每个实际匹配对象extract the full match。
pattern = re.compile(r"(.+?)\1+")
[match.group(0) for match in pattern.finditer('44442(2)2(2)44')]
答案 1 :(得分:3)
对OP正则表达式的改动很小:
struct class_record_node
如果没有组, [m[0] for m in re.compile(r"((.+?)\2+)").findall('44442(2)2(2)44')]
将为您提供完全匹配,如果有组,则
findall
。因此,假设你的需要组正常工作,我们只需添加另一个组来包含完整匹配,然后提取它。
答案 2 :(得分:0)
你可以这样做:
[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']