Python正则表达式的回顾后顾和前瞻

18

我需要从一个具有以下格式的字符串中匹配字符串 "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 这一部分?

2个回答

20

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

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

结果中不会考虑您输入的第一个斜杠。

regex101上测试:https://regex101.com/r/yzMkTg/1

按照以下方式转换您的代码,它应该可以正常工作:

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

请点击以下链接查看更多关于正向预查正向回顾行为的信息:

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


5
在Python 3.10中不起作用,你需要使用re.search而不是re.match。请参考 https://dev59.com/n6Xja4cB1Zd3GeqPTZjO - bers

14

你的回顾里缺少一个 <!

回顾应该像这样:

(?<=...)

不要这样:

(?=...)
那将是一个展望未来的样子!
所以,
(?<=/).*(?=/poo)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接