【问题标题】:what is non-grouping version of regular parentheses [duplicate]什么是正则括号的非分组版本[重复]
【发布时间】:2012-05-10 01:38:08
【问题描述】:

可能重复:
Non capturing group?

从 python re 模块文档中,我看到了:

(?:...)  Non-grouping version of regular parentheses.

(...)    Matches the RE inside the parentheses.
         The contents can be retrieved or matched later in the string.

有什么不同?

【问题讨论】:

  • imo 中的描述不是很准确。 (?:...) 仍然以某种方式“组合”内部表达式(想想 (?:...)+,量词应用于 while 组),但您不能稍后引用匹配的内容,因为它没有被捕获。

标签: python regex


【解决方案1】:

很快: 非分组意味着它不会被匹配到一个组中。也就是说,例如,您不能通过 \1 来引用它。

【讨论】:

    【解决方案2】:

    区别基本上就是肯特所说的。

    它可能对非常复杂的正则表达式很有用,或者适用于性能至关重要的大量文本。

    另外,如果你在你的正则表达式中使用了很多分组,但只有其中一些被引用(用于文本替换或任何原因),那么只有你真正的那些会更简单 em> 需要作为捕获组,因此您可以将 then 从 \1(或 $1,取决于)引用到 \n,而不是跳过数字。

    【讨论】:

      【解决方案3】:

      非分组允许您在匹配字符串中使用一系列字符,而不会将其作为实际匹配项之一返回。例如,假设您正在搜索收据,并且只想提取商品的价格。假设您的收据如下所示:

      milk 1.25
      bread 1.15
      deli meat 5.25
      total 7.65
      

      您可以使用非分组括号来排除价格为总计但包含所有其他价格的行。

      【讨论】:

      • 我认为您将非捕获组与环视混淆了。非捕获组确实成为匹配的一部分,您只是无法通过反向引用访问它们的内容。
      • @TimPietzcker 取决于您如何使用它们。我很确定至少在 Python 的正则表达式引擎中,非分组匹配不会出现在 .groups() 中,所以如果你正在做 findall() 或其他什么,它会像我描述的那样有效地运行。
      • @sr2222 但它会显示在 .group(0) 中,其中包含整个匹配项。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 2015-06-23
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多