关于非捕获组的Regex帮助

2024-10-02 14:17:53 发布

您现在位置:Python中文网/ 问答频道 /正文

一定是复制品,但我好像找不到它。。。在

我正在使用组匹配重复的子字符串。不过,我不想让这群人被俘。这似乎是一个矛盾。在

为了明确起见,假设我想找到一个全大写子集字符串的3个精确副本后面的任何字符。为

s = 'hjgABABABfgfBBdqCCCugDDD'
              |         |

它应该会回来

^{pr2}$

我可以很好地找到重复的字符串和下面的字符

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

如果能简短地验证一下这个问题确实是非捕获需求与检测重复所需的捕获之间的冲突,我将不胜感激。然后一个聪明的想法如何巧妙地实现目标。在


Tags: 字符串re副本grouperror字符子集reference
2条回答

这行不通的原因是,当你写\1时,你基本上是说“第一个组的内容”,如果这个组没有捕获,这当然是未定义的。在

因为一旦您在模式中定义了几个捕获组,^{}将始终获取元组的列表,因此您不能在这里使用“regex-only”方法。在

使用re.finditer获取所有匹配数据对象并仅从每个匹配项中获取组2内容:

print([x.group(2) for x in re.finditer(r'([A-Z]+)\1{2}(.)', s)])

参见Python demo

相关问题 更多 >