【问题标题】:Understanding Positive Look Ahead Assertion理解积极的前瞻性断言
【发布时间】:2014-07-02 04:20:46
【问题描述】:

From Python 3.4.1 docs:

(?=...)

正向前瞻断言。如果包含的正则表达式(此处由 ... 表示)在当前位置成功匹配,则此操作成功,否则失败。但是,一旦尝试了包含的表达式,匹配引擎就不会前进;模式的其余部分在断言开始的地方尝试。

我正在尝试理解 Python 中的正则表达式。你能帮我理解第二句话,尤其是粗体字吗?任何示例将不胜感激。

【问题讨论】:

  • SO 和外部已经有一些很好的资源可以帮助理解正则表达式
  • 这意味着正则表达式引擎一旦到达:(?=...) 就会停止使用该字符串 - 但是,它会继续通过表达式向前看,以匹配 (?:...) 中的 ...

标签: python regex lookahead


【解决方案1】:

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

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

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

关键点:

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

【讨论】:

  • 解释清楚,+1 :)
【解决方案2】:

示例形式的答案。在字符串"xy":

  • (?:x) 将匹配 "x"
  • (?:x)x 不会匹配,因为在x 之后没有另一个x
  • (?:x)y 将匹配 "xy",通过前进超过 x 然后 y。

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

  • (?=x)x 将匹配 "x" - 它识别出 x 紧随其后,然后向前移动。
  • (?=x)y 将不匹配,因为它确认有一个 x 跟随,但随后尝试使用 y 超越它。

【讨论】:

    【解决方案3】:

    通常,正则表达式引擎会逐个字符地“消耗”您的字符串,因为它与您的正则表达式匹配。

    如果您使用前瞻运算符,则引擎将在查找匹配项时直接前瞻而不“消耗”任何字符。

    示例

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

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

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

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

    现在.{6,20} 不再是前瞻,而是开始使用字符串。 当整个字符串被消耗掉时,就找到了一个匹配项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 2011-03-20
      相关资源
      最近更新 更多