理解积极向前看断言

时间:2014-07-02 04:20:47

标签: python regex lookahead

From Python 3.4.1 docs:

  

(?= ...)

     

积极的先行断言。如果包含的正则表达式(此处由...表示)在当前位置成功匹配,则成功,否则失败。但是,一旦尝试了包含的表达式,匹配引擎根本不会前进;该模式的其余部分在断言开始的处尝试

我试图理解Python中的正则表达式。你能帮我理解第二句话,特别是粗体字吗?任何例子都将不胜感激。

3 个答案:

答案 0 :(得分:6)

Lookarounds是零宽度断言。它们不会消耗字符串上的任何字符。

简要介绍文档的粗体部分:

  

这意味着在向前看之后,正则表达式引擎返回到它开始查找的字符串上的相同位置。从那里,它可以再次开始匹配......

关键点:

  

您可以获得零宽度匹配,这是一种不消费任何字符的匹配。它只匹配字符串中的位置。零宽度点是验证正则表达式是否可以向前看或不能与当前位置相匹配,而不是将它们添加到整体匹配中。

答案 1 :(得分:2)

通常情况下,正则表达式引擎会消耗"你的字符串字符,因为它与你的正则表达式匹配。

如果您使用前瞻操作员,则引擎将简单地向前看,而不会消耗"消耗"任何字符在寻找匹配时。

示例

一个很好的例子是一个正则表达式来匹配一个密码,它需要一个数字,并且长度在6-20个字符之间。

您可以编写两个检查(一个用于检查是否存在数字,另一个用于检查字符串长度是否符合要求),或使用单个正则表达式:

(?=.*\d).{6,20}

第一部分(?=.*\d)检查字符串中是否有数字。当它完成时,我们又回到了字符串的开头(我们只是#34;向前看")如果它通过了,我们就进入正则表达式的下一部分。

现在.{6,20}不再是前瞻,而是开始使用字符串。 消耗整个字符串后,找到匹配项。

答案 2 :(得分:1)

示例表单中的答案。在字符串"xy"上:

  • (?:x)将匹配"x"
  • (?:x)x将无法匹配,因为在x之后没有其他x
  • (?:x)y将与"xy"匹配,推进x然后y

  • (?=x)将匹配字符串开头的"",因为x正在关注。

  • (?=x)x将与"x"匹配 - 它会识别出x跟随,然后它会越过它。
  • (?=x)y将无法匹配,因为它确认有x跟随,但后来尝试使用y推进它。