【要約】Pythonの\dは全角数字にもマッチする——気づかず事故る正規表現のUnicode既定 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者が数値入力のバリデーションを実装する際、Pythonの仕様により意図しない文字種が通過してしまう問題がある。具体的には、以下の事象が発生する。
- ・Pythonの
reは既定でUnicodeモードであり、\dが全角数字や他言語の数字にマッチする。 - ・
int()は全角数字を解釈できるが、float()は全角ピリオド等でValueErrorを投げる。 - ・バリデーションは成功するが、後続の数値化処理で落ちる「時限式バグ」を招く。
// Approach
開発者は、正規表現の挙動を制御するか、入力データを標準的な形式に変換することで問題を解決できる。以下の3つの手法が有効である。
1.
[0-9]による明示的な記述:最も推奨される、ASCII数字のみに限定する方法。2.
re.ASCIIフラグの使用:\dや\wをまとめてASCII範囲に制限する方法。3.NFKC正規化:
unicodedata.normalizeを用い、全角文字を半角に寄せる方法。// Result
適切な対処法を選択することで、入力バリデーションの堅牢性と後続処理の整合性が向上する。
- ・
[0-9]やre.ASCIIの使用により、意図しないUnicode数字の混入を確実に防げる。 - ・NFKC正規化により、全角入力を許容しつつ、数値処理との整合性を保てる。
- ・言語を跨ぐ実装において、
\dの解釈の差異による事故を未然に防止できる。
Senior Engineer Insight
> 開発現場では「動く」ことよりも「意図通りであること」が重要だ。PythonのUnicode既定は多言語対応には有利だが、バリデーションにおいては脆弱性になり得る。特に、バリデーションと型変換の挙動が一致しない「時限式バグ」は、本番環境でのデータ不整合を招く。実装時は「
\dは魔法の記号ではない」と認識し、常にASCII範囲を意識するか、正規化を徹底すべきだ。