2011-07-10 94 views
10

我知道[]表示一組允許的字符 -正則表達式匹配中的b/w [ab]和(a | b)的差異?

>>> p = r'^[ab]$' 
>>> 
>>> re.search(p, '') 
>>> re.search(p, 'a') 
<_sre.SRE_Match object at 0x1004823d8> 
>>> re.search(p, 'b') 
<_sre.SRE_Match object at 0x100482370> 
>>> re.search(p, 'ab') 
>>> re.search(p, 'ba') 

但是......今天我碰到與括號內豎線的表達式來定義互斥模式 -

>>> q = r'^(a|b)$' 
>>> 
>>> re.search(q, '') 
>>> re.search(q, 'a') 
<_sre.SRE_Match object at 0x100498dc8> 
>>> re.search(q, 'b') 
<_sre.SRE_Match object at 0x100498e40> 
>>> re.search(q, 'ab') 
>>> re.search(q, 'ba') 

這似乎模仿與上述相同的功能,還是我錯過了某些東西?

PS:在Python括號本身用於定義匹配文本的邏輯組。如果我使用第二種技術,那麼如何在兩個作業中使用括號?

+0

不知道你的意思是用括號位什麼... – 2011-07-10 07:30:22

+1

是的,你是正確的 - '[AB]'和'(一| b)'完全相同(但第一個匹配更快)。正則表達式本身就是一種語言(無論你是用Python還是Perl發現它們),如果你打算有效地使用它們,你需要學習它們(神祕)的語法。 (例如正則表達式中的圓括號與正則表達式外的圓括號不同。)我建議遵循[regular-expressions.info](http://www.regular-expressions.info)上的教程。任何時間花在那裏都會得到多次獎勵。 – ridgerunner

回答

16

在這種情況下,它是一樣的。

然而,改變不僅限於單個字符。例如,

^(hello|world)$ 

將匹配 「你好」 或 「世界」(和只有這兩個輸入),而

^[helloworld]$ 

將只匹配單個字符( 「H」 或 「W」或「d」或什麼)。

快樂編碼。

13

[ab]匹配一個字符(a或b)並且不捕獲該組。 (a|b)捕獲a或b,並匹配它。在這種情況下,沒有太大區別,但是在更復雜的情況下,[]只能包含字符和字符類,而(|)可以在管道的任一側包含任意複雜的正則表達式

3

在給出的示例中,它們是可互換的。有一些值得注意的區別:

在字符類的方括號你沒有逃避什麼,但一個破折號或方括號,或插入符號^

(但當時只有當它的第一個字符)。

圓括號捕捉匹配,以便稍後可以引用它們。角色類匹配不這樣做。

可以匹配括號多字符串,但性格不同類