DESIGN / CODE / INFRA / AI

解説

AIの正規表現で全角数字も通る?Pythonの\dと[0-9]で許可する文字を決めよう

Python 3の文字列パターンで、半角・全角・アラビア数字を比較。Unicodeの十進数字とASCIIだけの検証を分け、正規化の判断を整理。

AIの正規表現で全角数字も通る?Pythonの\dと[0-9]で許可する文字を決めよう
保存リストを見る →
この記事の道しるべ 4項目

「数字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

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。