麻烦在python正则表达式中断言背后的正面看法

时间:2009-09-23 10:44:05

标签: python regex

尝试使用一个相当长的正则表达式,它归结为这个小部分,与我的预期不符。

>>> re.search(r'(foo)((?<==)bar)?', 'foo').groups()
('foo', None)

>>> re.search(r'(foo)((?<==)bar)?', 'foo=bar').groups()
('foo', None)

第一个是我正在追求的,第二个应该是('foo', 'bar')

我怀疑我只是误解了外观是如何工作的,有些解释会很棒。

3 个答案:

答案 0 :(得分:2)

目标背后的外观从未包含在匹配中 - 它应该用作锚点,但实际上并不是由正则表达式使用。

如果当前位置前面有目标,那么模式背后的外观应该匹配。在你的情况下,在字符串中匹配“foo”的后,当前位置是在“=”,这不是由“=”开头 - 它前面有“○”

另一种看待此问题的方法是查看re documentation并阅读

  

请注意,以正向lookbehind断言开头的模式在搜索字符串的开头永远不会匹配;

在匹配foo之后,你的背后是在字符串的(其余部分)的开头尝试匹配 - 这将永远不会有效。

其他人建议可能更适合你的正则表达式,但我认为你可能正在寻找

>>> re.search('(foo)(=(bar))?', 'foo=bar').groups()
('foo', '=bar', 'bar')

如果你发现额外的组有点烦人,你可以省略内部的“()”,然后只删除匹配组中的第一个字符......

答案 1 :(得分:1)

您可能只希望(foo)(?:=(bar))?使用非捕获组(?:)

lookbehind断言只是查看当前位置的左侧并检查提供的表达式是否匹配。因此,您的表达式与foo匹配,然后检查左侧的输入 - o中的第二个foo是否与=匹配。这当然总是失败。

答案 2 :(得分:0)

为什么不使用:

(foo)=?(bar)?

以下表达式似乎更正确,因为它在完整匹配中捕获'=',但您的原始表达式根本不捕获它:

(foo).?((?<==)bar)?