(?=...) 积极的前瞻性断言。如果包含的正则表达式(这里由.表示)在当前位置成功匹配,否则失败,则此操作将成功。但是,一旦尝试了包含的表达式,匹配引擎根本就不会推进;模式的其余部分将在断言启动的地方尝试。
我正在尝试理解Python中的regex。你能帮我理解第二句,尤其是黑体字吗?任何例子都将不胜感激。
发布于 2014-07-02 04:23:59
环顾四周是零宽度断言.它们不消耗字符串上的任何字符。
要简要地介绍一下文档的粗体部分:
这意味着,在向前看之后,正则表达式引擎从它开始查看的位置返回到字符串上的相同位置。从那里,它可以重新开始匹配..。
重点是:
您可以得到一个零宽度匹配,这是一个不消耗任何字符的匹配。它只匹配字符串中的位置。零宽度点是验证,以查看正则表达式是否可以或不能匹配,以向前看还是从当前位置回看,而不将它们添加到整个匹配中。
发布于 2014-07-02 04:28:17
通常,正则表达式引擎是“消耗”一个字符的字符串,因为它与正则表达式匹配。
如果您使用前瞻性操作符,引擎将只是简单地向前看,而不会在寻找匹配时“消耗”任何字符。
示例
一个很好的例子是一个正则表达式来匹配密码,它需要有一个数字数字,并且长度在6-20个字符之间。
您可以编写两个检查(一个检查数字是否存在,另一个检查字符串长度是否符合要求),或者使用一个正则表达式:
(?=.*\d).{6,20}第一部分(?=.*\d)检查字符串中是否有数字。当它完成时,我们又回到字符串的开头(我们只是“向前看”),如果它通过了,我们将进入正则表达式的下一部分。
现在,.{6,20}不再是向前看的,而是开始消耗字符串。当整个字符串被消耗时,已经找到了一个匹配项.
发布于 2014-07-02 04:28:57
以一个例子的形式回答。关于字符串"xy"
(?:x)将与"x"匹配(?:x)x将不匹配,因为在x之后没有其他x(?:x)y将与"xy"相提并论,通过在x和y上前进。(?=x)将在字符串的开头匹配"",因为x如下所示。(?=x)x将与"x"相匹配--它认识到一个x紧随其后,然后它就在它之上前进。(?=x)y将不匹配,因为它肯定有一个x追随者,但随后尝试使用y进行改进。https://stackoverflow.com/questions/24522811
复制相似问题