我搜索了这些表达的含义,但无法理解它们之间的确切差异。 这就是他们所说的:
?:
匹配表达式,但不捕获它。?=
匹配后缀但将其从捕获中排除。?!
匹配if后缀不存在。我尝试在简单的RegEx中使用这些,并获得了类似的结果。 例如:以下3个表达式给出了非常相似的结果。
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?!\.[a-zA-Z0-9]+)*
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?=\.[a-zA-Z0-9]+)*
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9]+)*
答案 0 :(得分:99)
?=
和?!
之间的区别在于前者要求给定的表达式匹配,后者要求不匹配。例如,a(?=b)
将匹配“ab”中的“a”,但不匹配“ac”中的“a”。而a(?!b)
将匹配“ac”中的“a”,而不匹配“ab”中的“a”。
?:
和?=
之间的区别在于?=
排除了整个匹配中的表达式,而?:
只是没有创建捕获组。因此,例如a(?:b)
将匹配“abc”中的“ab”,而a(?=b)
将仅匹配“abc”中的“a”。 a(b)
与“abc”中的“ab”匹配,创建包含“b”的捕获。
答案 1 :(得分:61)
?: is for non capturing group
?= is for positive look ahead
?! is for negative look ahead
?<= is for positive look behind
?<! is for negative look behind
请在此处查看:http://www.regular-expressions.info/lookaround.html,了解非常好的教程和正则表达式中的前瞻示例。
答案 2 :(得分:5)
尝试将foobar
与这些匹配:
/foo(?=b)(.*)/
/foo(?!b)(.*)/
第一个正则表达式将匹配并将返回&#34; bar&#34;作为第一个子匹配 - (?=b)
与&#39; b&#39;匹配,但不使用它,留下以下括号。
第二个正则表达式不匹配,因为它期望&#34; foo&#34;接下来是与&#39; b&#39;。
不同的东西 (?:...)
与简单(...)
具有完全相同的效果,但它不会将该部分作为子匹配返回。
答案 3 :(得分:0)
了解断言的最简单方法是将断言视为插入正则表达式中的命令。 当引擎运行到断言时,它将立即检查断言描述的条件。 如果结果为true,则继续运行正则表达式。
答案 4 :(得分:0)
这是真正的区别:
>>> re.match('a(?=b)bc', 'abc')
<Match...>
>>> re.match('a(?:b)c', 'abc')
<Match...>
# note:
>>> re.match('a(?=b)c', 'abc')
None
如果您不关心“?:”或“?=“,“ ?:”和“?=””之后的内容相同。两者都可以使用。
但是,如果您需要这些内容以进行进一步的处理(不仅要与整个过程匹配,在这种情况下,您可以简单地使用“ a(b)”),而必须使用“?=”。原因“?:”将通过它消失。