2016-05-11 14 views
1

私は次の正規表現があります。正規表現 - 試合の範囲

re.findall(r'(\b[A-Za-z][a-z]{3,10}\b)', string_var) 

を私は、この正規表現は3から10までの長さのマッチを返すことを期待。ただし、長さが4から11までの単語の一致を返します。

上記の正規表現は、大文字または小文字の文字で始まり、長さが3から10までの文字で始まります。言い換えれば、範囲を拡張した余分な文字として最初の文字を持つ?

ありがとうございました。

+2

あなたのマッチは4文字から11文字の範囲です。 '{3、10}'量子(つまり、少なくとも3つと10以下)は、第2の文字セットにのみ適用されます。 – miqid

+0

ご意見ありがとうございます。申し訳ありませんが、私は11の代わりに8を入力し、10の代わりに7を入力しました。 – Simplicity

答えて

3

はい。

あなたの正規表現は

(\b[A-Za-z][a-z]{3,10}\b) 

は今、グループ化括弧は試合に影響を与えませんので、我々は彼らを無視することができます。 \bは、「ゼロ幅」のマッチング演算子です。つまり、ある文字クラスから別の文字クラスへの遷移に一致します。したがって、実際にはどの文字にも対応しません。私たちはそれらを無視することができます。すなわち、これを残す:

[A-Za-z][a-z]{3,10} 

これは第二に繰り返し指定サフィックスを持つ2つの文字クラスである:

  1. [A-ZA-Z] - 一文字、大文字または小文字のラテン語と一致しますアルファベット。

  2. [-Z] {3,10} - マッチ少なくとも3、最大10文字で、

だから合計で、あなたは、1 + [3,10]の文字にマッチしている-Zを小文字。あなたの最小一致は4文字で、最大一致は11になります。