2

なぜ

len(re.findall('[0-9999][/][0-9999]', '15/11/2012'))

正しく 2 を返しますが、

len(re.findall('[0-9999][/][0-9999][/]', '15/11/2012'))

0 を返しますか? 1を返すべきではありませんか?

4

1 に答える 1

8

文字クラスを誤解しています。式は、1 つの文字、つまり括弧内の文字の 1 つ[abc123]一致します。は文字クラスの範囲演算子ですが、正規表現は数値範囲を認識せず、文字列範囲のみを認識します。つまり、は と同等で、重複した時間を指定しているだけです。-[0-9999][0-9]9

5/1最初の正規表現で 2 つの一致が見つかった理由は、 and と一致しているためです1/2。2 番目の正規表現には、任意の 1 桁の数字に一致する柔軟性がないため、失敗します。

たとえば、2 と 1 の結果を返す正しい式は次のようになります。

[0-9]+/[0-9]+

[0-9]+/[0-9]+/

それぞれ。は量指定子+として知られています。

于 2013-07-27T16:14:28.487 に答える