正则表达式,选择最接近的匹配

时间:2015-01-14 08:48:13

标签: python regex

假设以下单词序列

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

我想要做的是将文本从BLA提取到LOOK,但是最接近外观的BLA。即我想得到

BLA text text text text LOOK 

我应该如何使用正则表达式?我找到了一个有效的解决方案,但效率非常低。

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

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

我想做的是:我希望与BLA相匹配,然后向前推进,直到LOOK的前向前瞻或BLA的前瞻性前瞻。但是我不知道如何把它变成正则表达式。

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

3 个答案:

答案 0 :(得分:10)

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

试试这个。看看演示。

https://regex101.com/r/fA6wE2/12

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

更安全。

答案 1 :(得分:0)

只需在LOOK和BLA之间找到没有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'

: - )

答案 2 :(得分:0)

提取所需文本的另一种方法是使用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之类的单词。