【问题标题】:Regex, select closest match正则表达式,选择最接近的匹配
【发布时间】:2015-01-14 08:48:12
【问题描述】:

假设以下单词序列

BLA text text text  text text text BLA text text text text LOOK text text text BLA text text BLA

我想做的是从 BLA 中提取文本到 LOOK,但是最接近的 BLA。 IE。我想得到

BLA text text text text LOOK 

我应该如何使用正则表达式来做到这一点?我得到了一种可行的解决方案,但效率极低。

BLA(?!.*?BLA.*?LOOK).*?LOOK

是否有更好、更高效的方法来实现匹配此模式?

我想做的是:我想匹配 BLA,然后向前向前看,直到用 LOOK 向前向前向前看,或者用 BLA 向后向前向前看。但我不知道如何将其放入正则表达式中。

作为引擎,我在 python 中使用 re。

【问题讨论】:

    标签: python regex


    【解决方案1】:
    (?s)BLA(?:(?!BLA).)*?LOOK
    

    试试这个。见demo

    或者,使用

    BLA(?:(?!BLA|LOOK)[\s\S])*LOOK
    

    为了更安全。

    【讨论】:

    • 好的,简而言之,要在 Regex 中找到第一次出现,我们需要: sometext.*?LOOK 它将匹配一些文本和任意数字字符,直到 first 出现
    • @kosiara-BartoszKosarzycki 是的......你可以使用第二个正则表达式是你想要最接近的somtextlook
    • 天哪,我终于找到了正确的。谢谢!
    【解决方案2】:

    另一种提取所需文本的方法是使用tempered greedy token 技术,该技术匹配一系列不以不需要的字符串开头的单个字符。

    r'\bBLA\b(?:(?!\bBLA\b).)*\bLOOK\b'
    

    Start your engine! | Python code

    \bBLA\b        : match 'BLA' with word boundaries
    (?:            : begin non-capture group
      (?!\bBLA\b)  : negative lookahead asserts following characters are not
                     'BLA' with word boundaries
      .            : match any character
    )              : end non-capture group
    *              : execute non-capture group 0+ times
    \bLOOK\b       : match 'LOOK' with word boundaries
    

    包含单词边界以避免匹配单词,例如 BLACKTRAILBLAZER

    【讨论】:

      【解决方案3】:

      只需在没有 BLA 的 LOOK 和 BLA 之间查找文本

      In : re.search(r'BLA [^(BLA)]+ LOOK', 'BLA text text text  text text text BLA text text text text LOOK text text text BLA text text BLA').group()
      Out: 'BLA text text text text LOOK'
      

      :-)

      【讨论】:

      • 哦...就这么简单 :-) 谢谢!
      • 问题是:如果我使用表达式例如它不起作用on BLA text text text text text BLA text teLxt text text LOOK text text text bla text text BLA so if there is a L between BLA and LOOK
      • 我好像需要补习一下你的正则表达式知识。因为[^(BLA)]+ 确实意味着它不会匹配BLA 而不会匹配B(L
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多