【问题标题】:Positive lookbehind vs non-capturing group: different behaviuor积极的后视与非捕获组:不同的行为
【发布时间】:2013-01-19 11:40:22
【问题描述】:

我在我的代码中使用了 python 正则表达式(re 模块)并注意到这些情况下的不同行为:

re.findall(r'\s*(?:[a-z]\))?[^.)]+', 'a) xyz. b) abc.') # non-capturing group
# results in ['a) xyz', ' b) abc']

re.findall(r'\s*(?<=[a-z]\))?[^.)]+', 'a) xyz. b) abc.') # lookbehind
# results in ['a', ' xyz', ' b', ' abc']

我需要得到的只是['xyz', 'abc']。为什么这些示例的行为不同以及如何获得预期的结果?

【问题讨论】:

    标签: python regex lookbehind capturing-group


    【解决方案1】:

    ab 包含在 第二种情况 中的原因是因为 (?&lt;=[a-z]\)) 会首先找到 a) 并且由于环视不会消耗任何字符 返回字符串的开头。现在[^.)]+匹配a

    现在您位于)。由于您已将(?&lt;=[a-z]\)) 设为可选[^.)]+ 匹配xyz

    b) abc 重复同样的事情

    从第二种情况中删除?,你会得到预期的结果,即['xyz', 'abc']

    【讨论】:

    • 第一种情况下的非捕获组也是可选的(如果文本中没有a),则匹配整个文本)。
    • @chersanya 这就是为什么我说第二种情况而不是第一种情况..它们之间有区别
    • @chersanya 还环顾四周检查指定的模式,但它不吃任何字符..因此结果
    • 哦,我明白了)真正的问题是环视不会消耗任何东西,所以 findall 也在a) 中找到了a
    • 您会在答案中添加原因吗?
    【解决方案2】:

    您正在寻找的正则表达式是:

    re.findall(r'(?<=[a-z]\) )[^) .]+', 'a) xyz. b) abc.')
    

    我相信 Anirudha 目前接受的答案解释了您使用正向后视和非捕获井之间的区别,但是,在正向后视之后删除 ? 的建议实际上会导致 [' xyz', ' abc'](注意包括空格)。

    这是由于正向后视不匹配 space 字符,也未将 space 包括在主要匹配字符类本身中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      相关资源
      最近更新 更多