Python正则表达式后瞻和前瞻

问题描述 投票:0回答:3

我需要使用以下格式匹配字符串中的字符串“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部分?

regex regex-lookarounds lookbehind
3个回答
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
投票

在你的背后,你错过了一个<

Lookbehinds看起来像这样:

(?<=...)

不是这样的:

(?=...)

那将是一个先行!

所以,

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

-1
投票

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

出于某种原因,我在我的脚本中获得了None,并且我在RegExTester中获得了完全相同代码的正确输出,所以我猜我的脚本有问题。

谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.