文字列から文字と数字を抽出したい。
私はこれを試しました:
>>> re.findall(r'[a-z]|\d*','a11b4')
['a', '11', 'b', '4', '']
>>> re.findall(r'\d*|[a-z]','a11b4')
['', '11', '', '4', '']
正規表現で代替の順序を変更すると、出力が変わるのはなぜですか?
\d
と*
を使用しているためです。
[a-z]|\d*
がある場合、最初にa-z
と一致させようとします。そうでない場合は、0回以上の数字の繰り返しを一致させようとします。あなたの例では、最初にa
と一致します。
ただし、逆に、最初に0回以上の数字の繰り返しを一致させようとします。さて、a
is 0桁の繰り返しなので、「一致」と見なされます。 [a-z]
式はすでに0回の繰り返しに対応しているため、評価を試みません。
このパターンを適切に使用するには(特に、がを文字または少なくとも1桁にする場合)、代わりに次を使用できます。
[a-z]|\d+
または\d+|[a-z]
これにより、1桁以上の繰り返しが検索され、a
で一致しなくなり、[a-z]
が評価され、期待どおりの応答が得られます。