Python正则表达式的回顾与展望

Joh*_*lis 5 regex lookbehind regex-lookarounds

我需要从具有以下格式的字符串中匹配字符串“ foo”:

string = "/foo/boo/poo"
Run Code Online (Sandbox Code Playgroud)

我绑了这段代码:

poo = "poo"
foo = re.match('.*(?=/' + re.escape(poo) + ')', string).group(0)
Run Code Online (Sandbox Code Playgroud)

它为我/foo/boo提供了foo变量的内容(而不是just foo/boo)。

我尝试了这段代码:

poo = "poo"
foo = re.match('(?=/).*(?=/' + re.escape(poo) + ')', string).group(0)
Run Code Online (Sandbox Code Playgroud)

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

我如何只匹配foo/boo零件?

All*_*lan 14

嘿尝试以下正则表达式:

(?<=/).*(?=/poo)
^^^^^^
Run Code Online (Sandbox Code Playgroud)

它不会考虑您在结果中的第一个斜线。

测试regex101https : //regex101.com/r/yzMkTg/1

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

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

快速浏览一下这个链接有关的行为的详细信息Positive lookaheadPositive lookbehind

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

  • 它在 Python 3.10 中不起作用。您需要在那里使用“re.search”,而不是“re.match”。比较 /sf/ask/3255126031/ (5认同)

Swe*_*per 5

<在背后看起来缺少一个!

Lookbehinds看起来像这样:

(?<=...)
Run Code Online (Sandbox Code Playgroud)

不像这样:

(?=...)
Run Code Online (Sandbox Code Playgroud)

那将是未来

所以,

(?<=/).*(?=/poo)
Run Code Online (Sandbox Code Playgroud)