【问题标题】:Regex help on non-capturing groups非捕获组的正则表达式帮助
【发布时间】:2017-04-27 09:34:38
【问题描述】:

一定是重复的,但我好像找不到...

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

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

我会很感激简短的验证,该问题确实是非捕获要求和检测重复所需的捕获之间的冲突。然后一个聪明的想法如何巧妙地实现目标。

【问题讨论】:

  • 有了re模块,没有捕获组是不可能的。但是使用regex 模块,它可能会possible..
  • 我的回答对你有用吗?

标签: python regex python-3.x


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    一旦您在模式中定义了多个捕获组,re.findall 将始终获取元组列表,因此您不能在此处使用“仅正则表达式”方法。

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

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

    Python demo

    【讨论】:

      猜你喜欢
      • 2019-11-14
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 2014-08-17
      相关资源
      最近更新 更多