【问题标题】:Why isn't the regular expression's "non-capturing" group working?为什么正则表达式的“非捕获”组不起作用?
【发布时间】:2011-02-11 18:44:16
【问题描述】:

在下面的sn-p中,匹配结果中应该忽略非捕获组"(?:aaa)"

结果应仅为"_bbb"

但是,我在匹配结果中得到"aaa_bbb";只有当我指定 group(2) 时它才会显示"_bbb"

>>> import re
>>> s = "aaa_bbb"
>>> print(re.match(r"(?:aaa)(_bbb)", s).group())

aaa_bbb

【问题讨论】:

  • 酷,感谢您的编辑,以及指出非捕获组概念的答案

标签: python regex


【解决方案1】:

试试:

print(re.match(r"(?:aaa)(_bbb)", string1).group(1))

group()group(0) 相同,组 0 始终存在,这是 整个 RE 匹配。

【讨论】:

    【解决方案2】:

    TFM:

    class re.MatchObject

    group([group1, ...])

    返回匹配的一个或多个子组。如果只有一个参数,则结果为单个字符串;如果有多个参数,则结果是一个元组,每个参数一个项目。 没有参数,group1 默认为零(返回整个匹配项)。如果 groupN 参数为零,则对应的返回值是整个匹配字符串。

    【讨论】:

      【解决方案3】:

      您必须指定 group(1) 才能仅获取括号捕获的部分(在本例中为 _bbb)。

      group() 不带参数将返回完整的正则表达式匹配的整个字符串,无论它的某些部分是否额外被括号捕获。

      【讨论】:

        【解决方案4】:

        group()group(0) 将返回整个匹配项。后续组是实际的捕获组。

        >>> print (re.match(r"(?:aaa)(_bbb)", string1).group(0))
        aaa_bbb
        >>> print (re.match(r"(?:aaa)(_bbb)", string1).group(1))
        _bbb
        >>> print (re.match(r"(?:aaa)(_bbb)", string1).group(2))
        Traceback (most recent call last):
          File "<stdin>", line 1, in ?
        IndexError: no such group
        

        如果你想要与group() 相同的行为:

        " ".join(re.match(r"(?:aaa)(_bbb)", string1).groups())

        【讨论】:

          【解决方案5】:

          我认为您误解了“非捕获组”的概念。非捕获组匹配的文本仍会成为整个正则表达式匹配的一部分。

          正则表达式 (?:aaa)(_bbb) 和正则表达式 (aaa)(_bbb) 都返回 aaa_bbb 作为整体匹配。不同之处在于,第一个正则表达式有一个捕获组返回 _bbb 作为其匹配项,而第二个正则表达式有两个捕获组返回 aaa_bbb 作为它们各自的匹配项。在您的 Python 代码中,要获得_bbb,您需要将group(1) 与第一个正则表达式一起使用,并将group(2) 与第二个正则表达式一起使用。

          非捕获组的主要好处是您可以将它们添加到正则表达式中,而不会打乱正则表达式中捕获组的编号。它们还提供(稍微)更好的性能,因为正则表达式引擎不必跟踪与非捕获组匹配的文本。

          如果你真的想从整个正则表达式匹配中排除aaa,那么你需要使用lookaround。在这种情况下,积极的后视可以解决问题:(?&lt;=aaa)_bbb。使用这个正则表达式,group() 在 Python 中返回 _bbb。不需要捕获组。

          我的建议是,如果您能够使用捕获组来获取部分正则表达式匹配,请使用该方法而不是环视。

          【讨论】:

          • 这是一个比接受的答案更有用的答案。
          【解决方案6】:

          在匹配对象上使用组方法而不是组。它返回所有捕获缓冲区的列表。不带参数的 group 方法返回正则表达式的整个匹配项。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-11-05
            • 2014-08-16
            • 2011-03-31
            相关资源
            最近更新 更多