环顾和非捕获组之间的功能差异?
我试图提出一个示例,在该示例中,积极的环顾有效,但非捕获组则无效,以进一步了解其用法。我也想出了与非捕获小组一起工作的所有示例,所以我觉得我没有完全掌握正面环顾的用法。
这是一个字符串(取自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包围的所有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])|...