2011-07-10 10 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では、かっこ自体が一致するテキストの論理グループを定義するために使用されます。私が2番目のテクニックを使用する場合、どのように両方のジョブにかっこを使用しますか?

+0

ないあなたは括弧ビットで何を意味するかわから... –

+1

はい、あなたは正しいです - '[AB]'と '(A | b) 'どちらも_exactly_と同じものにマッチします(しかし最初のものはより速くマッチします)。正規表現は、PythonやPerlで見つけても、自分自身の言葉であり、効果的に使うつもりなら、(暗黙の)構文を学ぶ必要があります。 (例えば、正規表現内のカッコは、正規表現の外のカッコと同じではありません。)[regular-expressions.info](http://www.regular-expressions.info)のチュートリアルに従うことをお勧めします。過ごす時間が何度も何度も報酬を受けるでしょう。 – ridgerunner

答えて

16

この場合も同じです。

しかし、代替は単なる文字に限定されません。例えば、

^(hello|world)$ 

は "ハロー" や "世界" と一致します(とのみこれら二つの入力)しばらく

^[helloworld]$ 

ちょうど単一の文字( "H" またはにマッチします "W" 「d」など)。

ハッピーコーディング。

13

[ab]は、1文字(aまたはb)と一致し、グループを取得しません。 (a|b)はaまたはbをキャプチャし、一致します。この場合、大きな違いはありませんが、より複雑なケースでは[]は文字と文字クラスのみを含むことができますが、(|)は任意の複雑な正規表現をパイプの両側に含めることができます

3

与えられた例では、

文字クラスで

角括弧を使用すると、ダッシュや角括弧、またはキャレット^何でもエスケープする必要はありません

:注目に値するいくつかの違いがあります(ただし、それは最初の文字だ場合にのみです。)

括弧はマッチをキャプチャするので、後で参照することができます。文字クラスのマッチはそれをしません。

あなたは文字クラスにカッコ内の複数の文字列を一致させることはできませんが

関連する問題