我有一个字符串,必须提取。问题是我不能在重复中描述重复。所以这是代码:
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})+
它给出了相同的结果。生成匹配对象,我无法获得我想要的组。
答案 0 :(得分: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')
,然后将其与在-
或_
出现时拆分第二群组的结果相结合。
如果你总是知道两个字符模式的确切数量,你可以通过前瞻来完成这个,但看起来并不是预先知道的,或者你不需要重复。