2015-12-07 50 views
5

我有这样正则表达式懒惰量词

a something* q b c w 

一个句子,我必须匹配一个q在一起,就像

(id_1: a, id_2: q) 

b单独像

(id_1: b) 

ç瓦特在一起,就像 (ID_1:C ID_2:W)。

我试图用因为懒惰操作的这个正则表达式

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)?\b) 

*?正则表达式只有一句话的第一部分相匹配,仅匹配

(id_1: a, id_1: b, id_1: c) 

Live Example

如果我们用一个贪婪的运营商,从而表达变得

(?:\b(?P<id_1>a|b|c)\b(?:.*)(?P<id_2>q|w)?\b) 

Live Example

它匹配

(id_1: a) 

之后的一切都匹配为。*

如果第二部分是强制性的(与懒*):

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)\b) 

Live Example

它匹配这样的句子

(id_1: a, id_2: q);(id_1: b, id_2: w) 

预期。

可以使用正则表达式“优先”匹配整个句子(包括可选部分),或者只匹配第一部分只有(如果缺少可选部分)。

编辑: 对不起,提供的正则表达式有一些错误。

最后的正则表达式是:

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)\b) 

,它需要两个组是强制性的。它匹配“某事* W”,但不匹配“某事*”或“一个”。我需要匹配“一个东西* W”以及“a”和“仙”,并分别获得匹配组:

(id_1: a , id_2: w) ; (id_1: a, id_2: none) ; (id_1:a , id_2: w) 

我认为需要的正则表达式是:

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)?\b) 

但在句子“a something * w”中,它只匹配“a”(由于*上的惰性运算符)。

我也更新了所有的实例。

+1

是不是你最后的正则表达式匹配字符串你需要的方式?我删除了'b c w'并且有一场比赛。你能用1个例子来描述你需要匹配什么,哪个正则表达式最接近,缺少什么? –

+0

嗨@stribizhev,谢谢你的帮助。我编辑了这个问题,因为表达式中有一些错误。我还在编辑部分提供了一个例子。 – Desh901

+0

Like ['\ b(?P a | b | c)\ b(?:(?!\ b(?:q | w)\ b)。)*(?P q | w |)\ b '](https://regex101.com/r/vU4wZ0/4)?或者也许,[?\ b(?P a | b | c)\ b(?:(?!\ b(?:q | w)\ b)。)*(?P q | w) B'](https://regex101.com/r/iP2pZ5/1)? –

回答

1

延迟点匹配是问题的根本原因,因为它需要存在尾随边界。

如果你需要匹配一些不是特定文本的文本,你可以使用两件事情:一个脾气暴躁的令牌或基于unroll-the-loop的正则表达式。

如果你有变量,你可以使用一个tempered greedy token,使第二捕获组可选的?量词:

\b(?P<id_1>a|b|c)\b(?:(?!\b(?:a|b|c|q|w)\b).)*(?P<id_2>q|w)?\b 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^   ^

regex demo

+0

如果您有多行输入,请不要忘记使用're.DOTALL' /'re.S'标志,以便'.'可以匹配一个换行符。 –