外观和非捕获组之间的功能差异?

时间:2017-08-29 17:18:51

标签: python regex python-3.x regex-lookarounds regex-group

我正试图想出一个正面看起来有效的例子 非捕获组将无法工作,以进一步了解它们的用法。这些例子我也提到了非捕获组的所有工作,所以我觉得我并没有完全掌握正面看法的用法。

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

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

感谢。

1 个答案:

答案 0 :(得分:7)

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

这会产生根本区别的一个例子是,当您尝试匹配某些字符串时,这些字符串被某些边界包围,并且这些边界可能会重叠。示例任务:

匹配给定字符串中的所有<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head></head> <body> <div th:fragment="your_fragment" th:remove="tag"> Hello <span th:text="${user.name}" th:remove="tag"></span> </div> </body> </html> ,其被<head> Hello username <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> </head> s包围 - 给定字符串为a。在第2和第4位应该有两场比赛。

使用外观相当容易,您可以使用bbababaca并匹配它们。但是b(a)(?=b)不会起作用 - 第一场比赛也会消耗位置3的b,这是第二场比赛的边界。 (注意:这里实际上并不需要非捕获组)

另一个相当突出的示例是密码验证 - 检查密码是否包含大写,小写字母,数字等等 - 您可以使用一系列替换来匹配这些 - 但前瞻性更容易:

(?<=b)a(?=b)

VS

(?:b)a(?:b)