正規表現の \d は全角数字に当たるか|Python・JavaScript・Go の違い(2026年版)

\d は「数字1文字」だと思って書いたのに、全角の「1」が通ってしまった(あるいは通らなかった)——という食い違いは、言語によって \d の定義が違うことから来ています。結論を先に書くと、Python は既定で Unicode の数字に当たり、JavaScript と Go は [0-9] だけです。

結論(手元で動かした結果)

全角数字「1」、アラビア・インド数字「٣」、半角の「5」を、同じ \d で試した結果です。実行したのは Python 3.9.0 / Node.js v22.22.3 / Go 1.26.2 で、2026-10-08 に手元で実行しました。

対象の文字Python \d(既定)Python \d + re.ASCIIJavaScript \dGo \d
5(半角)一致一致一致一致
1(全角)一致一致しない一致しない一致しない
٣(アラビア・インド数字)一致一致しない一致しない一致しない
同じパターン \d を3つの処理系で実行した結果(2026-10-08 実行)

つまり Python で書いたバリデーションをそのまま JavaScript に移すと、全角数字の扱いが静かに変わります。「Python 側では弾けていた入力が、フロントエンドでは弾けない(逆もある)」という形で出てきます。

仕様はどう書かれているか

挙動の違いは実装の癖ではなく、それぞれの仕様にそう書かれています。

Python

str パターンの \d について、公式ドキュメントはこう書いています。

Matches any Unicode decimal digit (that is, any character in Unicode character category [Nd]). This includes [0-9], and also many other digit characters. Matches [0-9] if the ASCII flag is used.

re — Regular expression operations(Python 公式ドキュメント・取得日 2026-10-08)

bytes パターンでは [0-9] と同じになる、とも明記されています。\w も同様で、既定では Unicode の英数字(str.isalnum() の定義)に当たるため、日本語の「あ」も \w に一致します(これも手元で確認しました)。

JavaScript

\d: Matches any digit character. Equivalent to [0-9].

Character class escape(MDN・取得日 2026-10-08)

Unicode の数字を拾いたいときは \p{Nd} を使いますが、MDN は「\p と \P は Unicode-aware mode でのみサポートされ、そうでないモードでは p / P という文字そのものの escape になる」と書いています。つまり u フラグを付け忘れると \p{Nd} は黙って別の意味になります。手元でも /\p{Nd}/u なら全角「1」に一致しました。

Go

\d : digits (== [0-9]) / \w : word characters (== [0-9A-Za-z_]) / \s : whitespace (== [\t\n\f\r ])

regexp/syntax(Go 公式ドキュメント・取得日 2026-10-08)

Go は定義がそのまま [0-9] なので迷いがありません。Unicode を扱うときは \p{Nd} のような Unicode character class を使います。

どう書けば意図どおりになるか

  • 半角数字だけを許したい(郵便番号・電話番号・ID など)→ \d に頼らず [0-9] と書く。どの処理系でも意味が変わりません。Python で \d を使うなら re.ASCII を付けます。
  • 全角で入力されても受けたい → 正規表現で許すのではなく、照合する前に正規化する(Python なら unicodedata.normalize("NFKC", s)、JavaScript なら s.normalize("NFKC"))。そのうえで [0-9] で照合すると、入口が1か所にまとまります。
  • Unicode の数字をそのまま拾いたい → \p{Nd} を使う。JavaScript では u フラグを必ず付ける。
  • 単語文字の境界 → Python の \w は日本語にも当たるので、\b を使った境界判定も言語間で揃いません。意図が「ASCII の識別子」なら [A-Za-z0-9_] と書き切るほうが安全です。

手元で試す

当サイトの正規表現チェッカーで、一致箇所とグループをその場で確かめられます。入力した内容はブラウザの中だけで処理し、どこにも送信しません。ただし動いているのは JavaScript の RegExp です——この記事のとおり、ここで通っても Python や Go でそのまま通るとは限らないので、最終的には使う処理系で確かめてください。

この記事の表は、記載のバージョンで 2026-10-08 に実行した結果です。仕様の引用元は各リンク先(同日取得)。処理系のバージョンが変われば挙動も変わりうるので、重要な判定は自分の環境で確かめてください。

コメント

タイトルとURLをコピーしました