必须是重复但我似乎无法找到它......
我正在使用一个组来匹配重复的子字符串。但是,我不希望该组被捕获。这似乎是一个矛盾。
明确地假设我想找到跟随所有大写子集字符串的3个精确副本的任何字符。对于
s = 'hjgABABABfgfBBdqCCCugDDD'
| |
它应该返回
['f', 'u']
我可以通过
很好地找到重复的字符串和后面的字符import re
print(re.findall(r'([A-Z]+)\1{2}(.)', s))
给出了
[('AB', 'f'), ('C', 'u')]
我可以轻松解析结果列表并获得第二项。但有没有一种正则表达方式来获得第二个项目?如果我尝试
print(re.findall(r'(?:[A-Z]+)\1{2}(.)', s))
我得到了
raise source.error("invalid group reference", len(escape)) sre_constants.error: invalid group reference at position 10
我很欣赏一个简短的验证,即该问题确实是非捕获要求与检测重复所需的捕获之间的冲突。然后巧妙地了解如何实现目标。
答案 0 :(得分:2)
在模式中定义多个捕获组后,re.findall
将始终获取元组列表,您不能在此处使用“仅正则表达式”方法。
使用re.finditer
获取所有匹配数据对象,并仅从每个匹配中获取第2组内容:
print([x.group(2) for x in re.finditer(r'([A-Z]+)\1{2}(.)', s)])
请参阅Python demo
答案 1 :(得分:2)
这不起作用的原因是当你写\1
时,你基本上会说“第一组的内容”,如果该组是非捕获的,那当然是未定义的。