捕捉群体和外观

时间:2011-05-23 06:56:10

标签: python regex

我想知道捕获组(或非捕获)如何影响正则表达式中的外观。 这是两个例子:

test (?:(?!<start).)+

test (?!<start).+

如果有人能够解释正则表达式引擎如何详细解释这两种情况,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

  1. 环顾四周是zero-width。在这方面,将它们放在捕获组内部并没有多大意义,它们不会捕获比空字符串更有趣的东西(很像\b vs. (\b) Edge案例涉及反向引用可选组,但这不是很有趣。
  2. 积极的looharounds - (?=...)(?<=...) - 可以捕获群组。例如,/(?=(\b\w+\b))/将导致正匹配,其中每个匹配都有一个非空组。例如,/(?<=(.))\1/将匹配后跟相同字符的字符。
  3. 否定的looharounds - (?!...)(?<!...) - 无法捕获群组。当你想到它时,这很有意义,因为永远不会匹配,但是他们可以在其中使用捕获组。例如,^(?!.*(.).*\1).*$将匹配不包含重复字母的行。 同样,在这种情况下,\1行为如何表现出来并不是特别有趣。
  4. 现在,举个例子。这两种模式匹配不同的文本:

    1. (?:(?!<start).)+ - 检查我们是否不在文本start之后,然后匹配所有字符(行)。例子:

      1. 输入"start1234end",匹配整个输入 - 开始位置不在“开始”之后。
      2. 输入"before123startAfter"假设前一个匹配是"before123start"(在允许的不同模式下),下一个匹配无法从此处开始,并且会跳过一个字符:"fter"
    2. (?:(?!<start).)+ - 这里,对于每个字符重复使用lookbehind断言(对于直觉:如果组(?:...)+是循环,则断言是循环内部)。如果字符字符串start后直接,则不匹配字符:

      1. 输入"start1234end" - 首次匹配为"start"。引擎无法匹配下一个'1'(因为它不是start之后的字符),因此匹配停止。下一场比赛将是"234end"