【问题标题】:Python Re - Named Capture Group Too GreedyPython 重命名捕获组太贪婪
【发布时间】:2021-07-25 17:59:39
【问题描述】:

我想从以下字符串中提取“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 库来运行它。

【问题讨论】:

    标签: python regex python-re regex-greedy


    【解决方案1】:

    您的主要问题是正则表达式引擎从左到右搜索匹配项,一旦找到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&lt;bar&gt;\S+) - 组“bar”:一个或多个非空白字符
    • \s+ - 一个或多个空格字符
    • Foo - Foo 字符串。

    【讨论】:

    • 谢谢!这些解决方案就像一个魅力!如果要匹配的示例“Bar”字符串由多个单词组成,我可以研究一下吗?
    • @mistyped 如果Bar 由多个单词组成,您必须弄清楚mythe 之后的哪些文本需要使用才能跳过。或者,您应该定义要在“栏”组中捕获的“单词”的数量。您只需要非常具体地了解此正则表达式要求。
    • 谢谢!再次,这很有帮助。
    猜你喜欢
    • 2019-05-19
    • 2020-03-15
    • 2022-09-28
    • 2019-01-18
    • 1970-01-01
    • 2023-04-06
    • 2021-08-19
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多