解説
AIの正規表現で全角数字も通る?Pythonの\dと[0-9]で許可する文字を決めよう
Python 3の文字列パターンで、半角・全角・アラビア数字を比較。Unicodeの十進数字とASCIIだけの検証を分け、正規化の判断を整理。
![AIの正規表現で全角数字も通る?Pythonの\dと[0-9]で許可する文字を決めよう](/images/articles/ai-python-regex-unicode-digit-policy.png?v=2026-11-02T01%3A37%3A19.822Z)
「数字3桁だけ許可する正規表現」とAIへ頼み、\d{3}が返ってきた。これで半角の0〜9だけに制限できたと思っていないかな。
Python 3の文字列を扱う正規表現では、\dは半角の数字だけを意味しない。使う言語・対象の型・フラグをそろえ、許可する文字を確認しよう。Python 3.12の標準ライブラリだけで試せる例だよ。
Unicodeの十進数字を含む
Unicodeは、さまざまな言語の文字に番号などを割り当てる仕組み。Pythonのstrパターンの\dは、その中の十進数字に当たる文字を対象にする。
import re
samples = ['123', '123', '١٢٣', '12a']
for value in samples:
broad = bool(re.fullmatch(r'\d{3}', value))
narrow = bool(re.fullmatch(r'[0-9]{3}', value))
ascii_only = bool(re.fullmatch(r'\d{3}', value, flags=re.ASCII))
print(repr(value), broad, narrow, ascii_only)
fullmatchは、文字列全体がパターンへ一致するかを調べる関数。文字列の一部で数字が見つかるだけの判定にはしていないよ。
四つの入力で比べる
| 入力 | \d{3} | [0-9]{3} | \d{3}+ASCII |
|---|---|---|---|
| 123 | True | True | True |
| 123 | True | False | False |
| ١٢٣ | True | False | False |
| 12a | False | False | False |
三行目はアラビア・インド数字の例。見た目に慣れていなくても、Pythonの通常の\dでは対象になる。これは不具合ではなく、パターンの規則による結果だよ。
半角0〜9だけを許可する仕様なら、[0-9]と明示する方法がある。re.ASCIIを使う方法もあるけれど、そのフラグは\wや\sなど、他の文字クラスの扱いにも影響する。長いパターンの一部だけを変えるつもりなら、全体への影響を見直してね。
AIへ渡す条件に言語と文字の範囲を入れる
依頼文は、例えば「Python 3.12のstrに対する検証。半角ASCIIの0〜9だけで3文字。全角数字、空白、符号、英字は不可。全体一致で確かめるコードと反例も出して」と具体化できる。
数字を含むという条件、3文字という長さ、文字列全体の一致は別の条件。正解例だけでなく、123や12aなど、通したくない入力も検証表に入れよう。
正規化するか、拒否するかも別に決める
利用者の入力を広く受け付け、全角数字を半角へ直す仕様もある。一方、IDを原文どおり照合する場面では、勝手な変換が問題になることもあるよ。
その判断をAIや正規表現だけへ任せず、「入力を変える前の値を残すか」「変換してよい文字は何か」を先に決めたい。この例は何も正規化せず、そのまま判定している。
2026年10月29日にPython公式資料を確認し、四入力・三パターンをPython 3.12で実行した。JavaScriptなど別の正規表現エンジンへ、そのまま結果を一般化しないでね。searchとfullmatch、文字の正規化も関連するよ。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。