我正试图想出一个正面看起来有效的例子 非捕获组将无法工作,以进一步了解它们的用法。这些例子我也提到了非捕获组的所有工作,所以我觉得我并没有完全掌握正面看法的用法。
这是一个字符串,(取自一个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 :(得分: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位应该有两场比赛。
使用外观相当容易,您可以使用b
或bababaca
并匹配它们。但是b(a)(?=b)
不会起作用 - 第一场比赛也会消耗位置3的b,这是第二场比赛的边界。 (注意:这里实际上并不需要非捕获组)
另一个相当突出的示例是密码验证 - 检查密码是否包含大写,小写字母,数字等等 - 您可以使用一系列替换来匹配这些 - 但前瞻性更容易:
(?<=b)a(?=b)
VS
(?:b)a(?:b)