我想举一个例子,其中积极环顾四周,但
非捕获组将无法正常工作,以进一步了解其用法。我也想出了与非捕获小组一起工作的所有示例,因此我觉得我没有完全掌握正面环顾的用法。

这是一个字符串(取自SO示例),在答案中使用肯定的前瞻性。用户只想获取第二列的值,
第一列以ABC开头,最后一列的值为“有效”。

string ='''ABC1    1.1.1.1    20151118    active
          ABC2    2.2.2.2    20151118    inactive
          xxx     x.x.x.x    xxxxxxxx    active'''

给出的解决方案使用了“积极的前瞻性”,但我注意到我可以使用非捕获组来得出相同的答案。
因此,我很难提出一个例子,在该例子中,积极的环顾有效,非捕获性小组不起作用。
pattern =re.compile('ABC\w\s+(\S+)\s+(?=\S+\s+active)') #solution

pattern =re.compile('ABC\w\s+(\S+)\s+(?:\S+\s+active)') #solution w/out lookaround

如果有人愿意提供一个例子,我将不胜感激。

谢谢。

最佳答案

根本的区别在于以下事实:非捕获组仍会消耗它们匹配的字符串部分,从而使光标向前移动。

一个与之根本不同的示例是,当您尝试匹配某些字符串时,这些字符串被某些边界包围并且这些边界可以重叠。示例任务:

匹配给定字符串中所有被a包围的b s-给定字符串为bababaca。应该在位置2和4进行两次比赛。

使用环视很简单,您可以使用b(a)(?=b)(?<=b)a(?=b)进行匹配。但是(?:b)a(?:b)将不起作用-第一个匹配项还将消耗位置3处的b,这是第二个匹配项的边界。 (注意:这里实际上不需要非捕获组)

另一个比较突出的示例是密码验证-检查密码中是否包含大写,小写字母,数字等内容-您可以使用一堆替代字词来匹配它们-但提前查找会更容易:

(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!?.])


(?:.*[a-z].*[A-Z].*[0-9].*[!?.])|(?:.*[A-Z][a-z].*[0-9].*[!?.])|(?:.*[0-9].*[a-z].*[A-Z].*[!?.])|(?:.*[!?.].*[a-z].*[A-Z].*[0-9])|(?:.*[A-Z][a-z].*[!?.].*[0-9])|...

关于python - 环顾和非捕获组之间的功能差异?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45944858/

10-10 05:16