捕捉群组和环顾

2024-04-26 11:57:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道捕获组(或非捕获)如何影响Regex中的lookaround。 这里有两个例子:

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

test (?!<start).+

如果有人能详细解释regex引擎是如何解释这两种情况的,我将不胜感激。在


Tags: test引擎情况start例子regexlookaround
1条回答
网友
1楼 · 发布于 2024-04-26 11:57:23
  1. 环顾四周是zero-width。在这方面,将它们单独放在一个捕获组中没有多大意义,它们不会捕获比空字符串更有趣的内容(很像\b vs. (\b))。边案例涉及到反向引用可选组,但这不是很有趣。
  2. 正的looharounds-(?=...)(?<=...)-可以捕获群。例如,/(?=(\b\w+\b))/将产生正的匹配,其中每个匹配都有一个非空组。例如,/(?<=(.))\1/将匹配跟在相同字符后面的字符。在
  3. 负looharounds-(?!...)(?<!...)-无法捕获组。当你想到它的时候,这很有意义,因为永远不匹配,但是它们可以在它们内部使用捕捉组。例如,^(?!.*(.).*\1).*$将匹配不包含重复字母的行。再说一次,\1如何表现,在这种情况下,不属于群体的特殊性

现在,以你为例。两种模式匹配不同的文本:

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

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

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

相关问题 更多 >