\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.ASCII | JavaScript \d | Go \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
re — Regular expression operations(Python 公式ドキュメント・取得日 2026-10-08)[0-9], and also many other digit characters. Matches[0-9]if the ASCII flag is used.
bytes パターンでは [0-9] と同じになる、とも明記されています。\w も同様で、既定では Unicode の英数字(str.isalnum() の定義)に当たるため、日本語の「あ」も \w に一致します(これも手元で確認しました)。
JavaScript
Character class escape(MDN・取得日 2026-10-08)
\d: Matches any digit character. Equivalent to[0-9].
Unicode の数字を拾いたいときは \p{Nd} を使いますが、MDN は「\p と \P は Unicode-aware mode でのみサポートされ、そうでないモードでは p / P という文字そのものの escape になる」と書いています。つまり u フラグを付け忘れると \p{Nd} は黙って別の意味になります。手元でも /\p{Nd}/u なら全角「1」に一致しました。
Go
regexp/syntax(Go 公式ドキュメント・取得日 2026-10-08)
\d: digits (==[0-9]) /\w: word characters (==[0-9A-Za-z_]) /\s: whitespace (==[\t\n\f\r ])
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 に実行した結果です。仕様の引用元は各リンク先(同日取得)。処理系のバージョンが変われば挙動も変わりうるので、重要な判定は自分の環境で確かめてください。

コメント