web-dev-qa-db-ja.com

正規表現の代替の順序は重要ですか?

文字列から文字と数字を抽出したい。

私はこれを試しました:

>>> re.findall(r'[a-z]|\d*','a11b4')
['a', '11', 'b', '4', '']
>>> re.findall(r'\d*|[a-z]','a11b4')
['', '11', '', '4', '']

正規表現で代替の順序を変更すると、出力が変わるのはなぜですか?

3
arturMD

\d*を使用しているためです。

[a-z]|\d*がある場合、最初にa-zと一致させようとします。そうでない場合は、0回以上の数字の繰り返しを一致させようとします。あなたの例では、最初にaと一致します。

ただし、逆に、最初に0回以上の数字の繰り返しを一致させようとします。さて、ais 0桁の繰り返しなので、「一致」と見なされます。 [a-z]式はすでに0回の繰り返しに対応しているため、評価を試みません。

このパターンを適切に使用するには(特に、を文字または少なくとも1桁にする場合)、代わりに次を使用できます。

[a-z]|\d+または\d+|[a-z]

これにより、1桁以上の繰り返しが検索され、aで一致しなくなり、[a-z]が評価され、期待どおりの応答が得られます。

3
Jonno