2010-03-05 71 views
5

有沒有辦法讓單個正則表達式來滿足這個條件?如何在正則表達式中包含布爾AND?

我要尋找有從集MBIPI,任何順序, 三個字母一個「字」,但必須包含一

即。

re.match( 「[MBDPI] {3}」,富)和在富 「I」

因此,這(使用重新模塊在python)是正確的結果,但我能得到這個從一個正則表達式?

>>> for foo in ("MBI", "MIB", "BIM", "BMI", "IBM", "IMB", "MBD"): 
...  print foo, 
...  print re.match("[MBDPI]{3}", foo) and "I" in foo 
MBI True 
MIB True 
BIM True 
BMI True 
IBM True 
IMB True 
MBD False 

與正則表達式我知道我可以使用|作爲一個布爾OR運算符,但有一個布爾AND等價?

或者我需要一些向前或向後的查找?

+0

您還可以使用str.find()搜索字符'I'。來源:http://docs.python.org/library/stdtypes.html#str。找到 – Dor 2010-03-05 09:59:36

回答

2

抑或是你唯一可以做的事情:

\b(I[MBDPI]{2}|[MBDPI]I[MBDPI]|[MBDPI]{2}I)\b 

\b字符零寬度字邊界匹配。這可以確保您匹配的東西只有三個字符長。

你可能會遇到regular language可以做的事情。

另一種方法是,以匹配:

\b[MBDPI]{3}\b 

捕獲該組,然後尋找一個一

編輯:對於具有完整的答案的緣故,我會適應Jens' answer這使用Testing The Same Part of a String for More Than One Requirement

\b(?=[MBDPI]{3}\b)\w*I\w* 

字邊界檢查,以確保它只有三個字符長。

這是一個更先進的解決方案,適用於更多的情況,但我通常會喜歡什麼更容易閱讀(即「或」版本imho)。

3

您可以通過使用lookahead僞造布爾值AND。根據http://www.regular-expressions.info/lookaround2.html,這會爲你的情況下工作:

"\b(?=[MBDPI]{3}\b)\w*I\w*" 
+0

它可能需要字邊界檢查,否則+1,聰明的解決方案。 – cletus 2010-03-05 09:58:06

+0

我將編輯... – Jens 2010-03-05 09:58:58

+0

偉大的鏈接,謝謝。 – user213043 2010-03-05 12:08:15

2

你可以使用前瞻,看是否I存在:

(?=[MBDPI]{0,2}I)[MBDPI]{3} 
0

用正則表達式我知道我可以使用|作爲一個布爾OR運算符,但有一個布爾AND等價?

A和B =未(未A或不B)=([^ A] |?![^ B])實際上可以具有共同的部件

A和B的表達式。