2015-12-07 155 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'標誌,以便'.'可以匹配一個換行符。 –