尝试使用一个相当长的正则表达式,它归结为这个小部分,与我的预期不符。
>>> re.search(r'(foo)((?<==)bar)?', 'foo').groups()
('foo', None)
>>> re.search(r'(foo)((?<==)bar)?', 'foo=bar').groups()
('foo', None)
第一个是我正在追求的,第二个应该是('foo', 'bar')
。
我怀疑我只是误解了外观是如何工作的,有些解释会很棒。
答案 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)?