环顾和非捕获组之间的功能差异?

发布于 2021-01-29 17:14:32

我试图提出一个示例,在该示例中,积极的环顾有效,但非捕获组则无效,以进一步了解其用法。我也想出了与非捕获小组一起工作的所有示例,所以我觉得我没有完全掌握正面环顾的用法。

这是一个字符串(取自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

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

谢谢。

关注者
0
被浏览
40
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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

    匹配a给定字符串中被bs包围的所有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])|...
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看