Python 重新命名捕获组过于贪婪

Python Re - Named Capture Group Too Greedy

我想从以下字符串中选择“Bar”:

FooFooFoo the FooFoo the Bar Foo
FooFooFoo the FooFoo my Bar Foo

但是我写的正则表达式 (the|my) (?P<bar>.+?) Foo 似乎太贪心了,收集的文本比需要的多 (example at regex101.com)

edit:“Bar”是要匹配的示例字符串。在我的真实案例场景中,我可以由多个单词组成。

我做错了什么?谢谢!

我需要 运行 使用标准 re python 库。

您的主要问题是正则表达式引擎从左到右搜索匹配项,一旦找到 mythe.+? 将匹配除以下字符外的其他几个字符尽可能多的换行字符,但 尽可能多 以完成有效匹配。

您需要将所有文本(使用 .*?)匹配到 Foo:

之前的最后一个单词(可以与 \w+ 模式匹配)
(the|my) .*?(?P<bar>\w+) Foo

参见regex demo。另一种变体是将 themy 作为整个单词匹配,并将任何文本匹配到 Foo:

之前最接近的非空白字符块
\b(the|my)\b.*?(?P<bar>\S+)\s+Foo

参见 this regex demo详情:

  • \b(the|my)\b - themy 单词作为一个完整的单词
  • .*? - 除换行字符外的任何零个或多个字符,尽可能少
  • (?P<bar>\S+) - 组“bar”:一个或多个非空白字符
  • \s+ - 一个或多个空白字符
  • Foo - Foo 字符串。