2009-03-07 14 views
4

は、なぜ違っ以下の行為を行います。re.compile(r '[[]]')は何と一致しますか? Pythonのreモジュールで

>>> r = re.compile(r'[][]') 
>>> r.findall(r'[]') 
['[', ']'] 
>>> r = re.compile(r'[[]]') 
>>> r.findall(r'[]') 
['[]'] 
>>> r.findall(r'][') 
[] 
+0

[[私は例のコードにわずかな変更を行った(文字列を移動しますs = ".."からfindallの引数に一致するので、少しはっきりしています)、[] []と[[]]は異なる結果を生成することを指摘しています。また、タグからPythonタグを削除しました。 – dbr

+0

Pythonの重要な情報です。正規表現のフレーバは、文字クラスの角括弧で扱う方法によって大きく異なります。 Javaでは、これらの正規表現の両方がPatternSyntaxExceptionsになります。 –

答えて

16

正規表現は "[[]]" "[]" のサブストリングと一致します。最初の式は文字クラスを開始し、最初の式はそれを終了します。クラスには文字([)が1つしかありません。それに続けて2番目の文字()を付ける必要があります。したがって、表現は "["の後ろに "]"のいずれかの文字です。

+0

ありがとう、それは本当に役立ちます。 – gray

0

とr '[] []'は文字クラス{'['、 ']'}を形成し、 「[」または「]」。

+0

これは、2つの空の文字クラスを定義しています。例えば、 'a' [b] 'はaと一致しません。[b、aはaと一致し、bは – dbr

+0

です。 r '[] []'文字クラスは空であってはならないので、 ']'と '[' 'を含む文字クラスを形成します。 – Gumbo

4

文字クラス[で始まり、最初の]で終わる。

ように、発現[][]は、文字クラスなどの文字][付き文字クラスであります空であってはなりません:[][]
と表現[[]]はその後ちょうど[付き文字クラスと単一の文字]次のとおりです。]]

関連する問題