代码之家  ›  专栏  ›  技术社区  ›  Jim Horng

为什么正则表达式的“非捕获”组不起作用

  •  32
  • Jim Horng  · 技术社区  · 16 年前

    在下面的片段中 非捕获组 "(?:aaa)"

    结果应该是 "_bbb"

    然而,我得到 "aaa_bbb" 在匹配结果中;只有在指定组(2)时才会显示 .

    >>> import re
    >>> s = "aaa_bbb"
    >>> print(re.match(r"(?:aaa)(_bbb)", s).group())
    
    aaa_bbb
    
    6 回复  |  直到 7 年前
        1
  •  58
  •   Thomas Decaux    8 年前

    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
    

    组() :

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

        2
  •  106
  •   Jan Goyvaerts    16 年前

    两个正则表达式 (?:aaa)(_bbb) 还有正则表达式 (aaa)(_bbb) 返回 aaa_bbb 作为整体比赛。区别在于第一个正则表达式有一个捕获组返回 _bbb 而第二个正则表达式有两个返回的捕获组 aaa _bbb公司 作为他们各自的对手。在Python代码中 ,您需要使用 group(1) 第一个正则表达式 group(2)

    如果你真的想排除 aaa级 从整体正则表达式匹配中,您需要使用 lookaround . 在这种情况下,积极的回顾会起到以下作用: (?<=aaa)_bbb . 有了这个正则表达式, group() 退货 在Python中。不需要捕获组。

    我的建议是,如果您能够使用捕获组来获取regex匹配的一部分,请使用该方法而不是四处查看。

        3
  •  3
  •   Kenly    10 年前

    TFM :

    class re.MatchObject

    group([group1, ...])

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

        4
  •  1
  •   codaddict    16 年前

    尝试:

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

    group() 与相同 group(0) 0 总是存在的,它是 匹配。

        5
  •  0
  •   sth    16 年前

    您必须指定 group(1) _bbb

    group() 如果没有参数,则返回与完整正则表达式匹配的整个字符串,无论其中的某些部分是否被括号额外捕获。

        6
  •  0
  •   Matt    16 年前

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