在Python中使用正则表达式分割字符串

3

我使用

re.compile(r"(.+?)\1+").findall('44442(2)2(2)44')

可以得到

['4','2(2)','4']

但是我该如何获取

['4444','2(2)2(2)','44']

通过使用正则表达式?谢谢。
3个回答

4
不需要更改您的模式,只需要使用正确的函数来完成工作。如果模式中存在捕获组,则re.findall将返回一个组列表。要获取整个匹配项,请改用re.finditer,这样您就可以从每个实际匹配对象中提取完整的匹配项
pattern = re.compile(r"(.+?)\1+")
[match.group(0) for match in pattern.finditer('44442(2)2(2)44')]

哦,更好了。每天都有所学 :D - Amadan

3

不需要对OP的正则表达式做出太多修改:

[m[0] for m in re.compile(r"((.+?)\2+)").findall('44442(2)2(2)44')]

findall 函数如果没有分组,将返回完整匹配结果;如果有分组,则返回分组结果。因此,如果您的正则表达式需要分组才能工作,我们只需添加另一个组来包含完整��匹配,并在匹配后提取它即可。


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

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