我想举一个例子,其中积极环顾四周,但
非捕获组将无法正常工作,以进一步了解其用法。我也想出了与非捕获小组一起工作的所有示例,因此我觉得我没有完全掌握正面环顾的用法。
这是一个字符串(取自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/