正则表达式帮助非捕获组

时间:2017-04-27 09:34:39

标签: python regex python-3.x

必须是重复但我似乎无法找到它......

我正在使用一个组来匹配重复的子字符串。但是,我不希望该组被捕获。这似乎是一个矛盾。

明确地假设我想找到跟随所有大写子集字符串的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

我很欣赏一个简短的验证,即该问题确实是非捕获要求与检测重复所需的捕获之间的冲突。然后巧妙地了解如何实现目标。

2 个答案:

答案 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时,你基本上会说“第一组的内容”,如果该组是非捕获的,那当然是未定义的。