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 库。
您的主要问题是正则表达式引擎从左到右搜索匹配项,一旦找到 my
或 the
,.+?
将匹配除以下字符外的其他几个字符尽可能多的换行字符,但 尽可能多 以完成有效匹配。
您需要将所有文本(使用 .*?
)匹配到 Foo
:
之前的最后一个单词(可以与 \w+
模式匹配)
(the|my) .*?(?P<bar>\w+) Foo
参见regex demo。另一种变体是将 the
或 my
作为整个单词匹配,并将任何文本匹配到 Foo
:
之前最接近的非空白字符块
\b(the|my)\b.*?(?P<bar>\S+)\s+Foo
参见 this regex demo。 详情:
\b(the|my)\b
- the
或 my
单词作为一个完整的单词
.*?
- 除换行字符外的任何零个或多个字符,尽可能少
(?P<bar>\S+)
- 组“bar”:一个或多个非空白字符
\s+
- 一个或多个空白字符
Foo
- Foo
字符串。
我想从以下字符串中选择“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 库。
您的主要问题是正则表达式引擎从左到右搜索匹配项,一旦找到 my
或 the
,.+?
将匹配除以下字符外的其他几个字符尽可能多的换行字符,但 尽可能多 以完成有效匹配。
您需要将所有文本(使用 .*?
)匹配到 Foo
:
\w+
模式匹配)
(the|my) .*?(?P<bar>\w+) Foo
参见regex demo。另一种变体是将 the
或 my
作为整个单词匹配,并将任何文本匹配到 Foo
:
\b(the|my)\b.*?(?P<bar>\S+)\s+Foo
参见 this regex demo。 详情:
\b(the|my)\b
-the
或my
单词作为一个完整的单词.*?
- 除换行字符外的任何零个或多个字符,尽可能少(?P<bar>\S+)
- 组“bar”:一个或多个非空白字符\s+
- 一个或多个空白字符Foo
-Foo
字符串。