Python regex lookbehind和lookahead

时间:2017-12-19 12:14:52

标签: regex regex-lookarounds lookbehind

我需要使用以下格式匹配字符串中的字符串“foo”:

string = "/foo/boo/poo"

我绑了这段代码:

poo = "poo"
foo = re.match('.*(?=/' + re.escape(poo) + ')', string).group(0)

它给了我/foo/boo作为变量foo的内容(而不仅仅是foo/boo)。

我试过这段代码:

poo = "poo"
foo = re.match('(?=/).*(?=/' + re.escape(poo) + ')', string).group(0)

我得到了相同的输出(/foo/boo而不是foo/boo)。

如何仅匹配foo/boo部分?

3 个答案:

答案 0 :(得分:2)

你的背后隐藏着<

Lookbehinds看起来像这样:

(?<=...)

不喜欢这样:

(?=...)

那将是前瞻

所以,

(?<=/).*(?=/poo)

答案 1 :(得分:0)

嘿,请尝试以下正则表达式:

(?<=/).*(?=/poo)
^^^^^^

它不会考虑结果中的第一个斜杠。

经过测试 regex101 https://regex101.com/r/yzMkTg/1

按以下方式转换代码,它应该有效:

poo = "poo"
foo = re.match('(?<=/).*(?=/' + re.escape(poo) + ')', string).group(0)

快速浏览此链接,详细了解Positive lookaheadPositive lookbehind的行为

http://www.rexegg.com/regex-quickstart.html

答案 2 :(得分:-1)

艾伦的答案解决了这个问题。

出于某种原因,我在我的脚本中获得了None,并且我在RegExTester中获得了完全相同代码的正确输出,因此我猜测了那里&#39;我的剧本中出了点问题。

谢谢!