2009-05-24 85 views
5

在python正則表達式中,命名組和未命名組都是用'('和')'定義的。這導致了一個奇怪的行爲。正則表達式python,正則表達式,命名組和「邏輯或」運算符

"(?P<a>1)=(?P<b>2)" 

用於與文本「1 = 2」會發現命名的基團「A」與值「1」,並命名爲「B」組具有值「2」。但是,如果我想使用「邏輯或」操作符和連接多個規則,下面的正則表達式:

"((?P<a>1)=(?P<b>2))|(?P<c>3)" 

用相同的文字所用的「1 = 2」會發現一個無名組與值「1 = 2」 。我明白,正則表達式引擎會將包含組「a」和「b」的「(」和「)」視爲未命名的組,並報告它已找到。但我不想要一個未命名的羣組進行報告,我只是想使用「|」以便將多個正則表達式「粘合」在一起。沒有創建任何寄生未命名的組。這是在python中這樣做的一種方式嗎?

回答

13

使用(?:)擺脫無名組:

r"(?:(?P<a>1)=(?P<b>2))|(?P<c>3)" 

re文檔:

(?:...)的 定期括號內的非分組版本。匹配任何 正則表達式在 括號內,但匹配的子字符串 無法在 執行匹配或在模式中引用後面的 之後檢索。

順便說一下,替換運算符|的優先級非常低,以便在您的情況下不需要括號。你可以在你的正則表達式中刪除額外的圓括號,它會繼續按預期工作:

r"(?P<a>1)=(?P<b>2)|(?P<c>3)" 
+0

非常感謝,這就像一個魅力^ _ ^ – grigoryvp 2009-05-24 11:37:17