Python 正则表达式中的组重复嵌套

-2 投票
1 回答
1992 浏览
提问于 2025-04-17 15:38

我有一个字符串,需要从中提取一些东西。问题是我无法描述重复中的重复。所以这里是代码:

f = "Makimak-cg_mk_Mokarmi"
pattern = "([A-Za-z][A-Za-z0-9]+)((?:[-_]([a-z]{2}))+)"
mO = re.match(pattern, f)
print mO.groups()

结果将会是:

('Makimak', '-cg_mk', 'mk')

但我希望得到这样的元组:

('Makimak', '-cg_mk', 'cg', 'mk')

这里有一个组叫做 "-cg_mk",它包含了一个两字符模式的重复。但没有类似这样的东西:

[a-z]{2}+

结果中的组只返回了这里表达的重复的最后一部分:

([a-z]{2})

我想过应该也要有一个 "+",像这样:

([a-z]{2})+

但结果还是一样。虽然生成了匹配对象,但我就是无法得到我想要的组。

1 个回答

0

你可能需要分两步来完成这个任务:

>>> f = "Makimak-cg_mk_Mokarmi"
>>> pattern = "([A-Za-z][A-Za-z0-9]+)((?:[-_][a-z]{2})+)"
>>> mO = re.match(pattern, f)
>>> print mO.groups() + tuple(re.split('[-_]', mO.group(2))[1:])
('Makimak', '-cg_mk', 'cg', 'mk')

这段代码的作用是提取出一组内容 ('Makimak', '-cg_mk'),然后把这个结果和第二组内容通过 -_ 进行分割的结果结合起来。

如果你总是知道确切的两个字符模式的数量,你可以用一种叫做“前瞻”的方法来实现,但看起来你并不知道这个数量,所以才需要重复处理。

撰写回答