2012-08-14 67 views
2

我有這樣的正則表達式匹配的這兩種可能性之一:正則表達式或語句不匹配

(\b(Q|L[A-Z])\d{8}\b) 

# Possibilities 
LK10652174 
Q10652174 

現在這樣做的結果是:

>>> regex.findall(string) 
[(u'LK10652175', u'LK')] 

我不希望它選擇額外LK匹配,是否有方法來包裝OR聲明而不會得到這個額外的選擇?

+0

這裏是個不錯的好地方測試:HTTP://www.pythonregex。 com/ – Hassek 2012-08-14 21:35:50

回答

1

是,使用非捕獲括號(拖放最外面的括號,你不需要他們):

\b(?:Q|L[A-Z])\d{8}\b 
+0

感謝您的快速反應,以及不錯的提示:) – Hassek 2012-08-14 21:41:47

1

像往常一樣,(?:...)會一致,但無法反映的。

(\b(?:Q|L[A-Z])\d{8}\b) 
+0

感謝您的快速響應! – Hassek 2012-08-14 21:42:29

-1

從python文檔:

當一個圖案完全相匹配,該分支被接受。這個 意味着一旦A匹配,B將不會被進一步測試,即使它會產生更長的整體匹配。換句話說,'|'運營商 從不貪心。

這意味着你需要把它寫這樣以確保比賽是你打算整串:

import re 
a = re.compile("(Q\\d{8}|L[A-Z]\\d{8})") 
print a.findall("LK10652174 Q10652174") 
['LK10652174', 'Q10652174'] 
+0

這是不正確的,用任何最新投票答案進行測試,它會返回與您的結果相同的結果。文檔的含義是,如果第一個選項匹配(也就是'Q \ d {8}'),它就不會在__same模式中嘗試'L [A-Z]'選項,而不是在整個文本中。 – Hassek 2012-08-14 23:09:08

+0

足夠公平......捕獲組與非捕獲組匹配屬性對解釋爲什麼原始正則表達式不具有屬性(A | B)C = AC | AB至關重要。 – DrSkippy 2012-08-15 18:02:49