第6章 データエンジニアリング基礎(データ加工)
DS検定の正規表現(郵便番号・メールの書式判定)
DS検定(リテラシーレベル)のデータ加工には、正規表現で条件に合致するデータを抽出する項目が★1つ星で入っています。このページでは、郵便番号・商品コード・メールアドレスの書式を判定する式を例に、記号の読み方と、一致するかどうかの判断を確かめます。覚えるのは式の書き方よりも、式を見て、どの文字列に一致するかを読み取る力です。
このページは試験の学習用の整理です。データはすべて説明用の架空の例で、一致の結果はPythonのreモジュールで実行して確かめています。
この記事の目次
公式情報の確認
試験日、料金、申込条件、試験方式など変動する情報は、公式情報を最終確認してください。 当サイトの一次情報確認日: 2026-10-02。
試験の出題範囲・実施要項は変動するため、受験前に公式情報を確認してください。
結論
- 正規表現は、文字列の「形」を記号で表す方法。郵便番号なら「数字3つ、ハイフン、数字4つ」を \d{3}-\d{4} と書く
- +(1回以上)・*(0回以上)・?(0回か1回)・{m,n}(m回からn回)は、直前の文字のくり返し回数を決める記号
- 全体が決まった形かを判定するときは、先頭の^と末尾の$で囲む。囲まないと、桁が多い文字列の一部に一致して通ってしまう
- メールアドレスの判定でわかるのは書式だけで、そのアドレスが実在するかはわからない
正規表現の記号の読み方
Pythonの公式ドキュメントにある記号のうち、DS検定の学習で読めるようにしておきたいものを並べます。
| 記号 | 意味 | 例 |
|---|---|---|
| . | 改行以外の任意の1文字 | a.c は abc・a1c に一致 |
| ^ | 文字列の先頭 | ^AB は AB で始まる文字列 |
| $ | 文字列の末尾 | com$ は com で終わる文字列 |
| * | 直前を0回以上くり返す | ab* は a・ab・abb に一致 |
| + | 直前を1回以上くり返す | ab+ は ab・abb に一致、a には不一致 |
| ? | 直前を0回または1回 | ab? は a・ab に一致 |
| {m,n} | 直前をm回からn回くり返す | a{3,5} は a が3〜5個 |
| [ ] | かっこ内のどれか1文字 | [a-z] は小文字の英字、[0-5][0-9] は 00〜59 |
| \d | 数字1文字 | \d{4} は数字4つ |
くり返しの記号は、直前の1文字(またはかっこでまとめた部分)にかかります。ab+ は「a の後に b が1個以上」で、abab のくり返しではありません。くり返しの記号がどこにかかるかを見るのが、式を読むときの最初の手がかりです。
郵便番号・商品コード・メールアドレスの例
公式チェックリストが例に挙げるのは、メールアドレスの書式の判定です。同じ考え方で、郵便番号と商品コードも判定できます。全体が一致するかを調べた結果は次のとおりです。
| 判定したいもの | 式 | 一致する例 | 一致しない例 |
|---|---|---|---|
| 郵便番号(123-4567の形) | \d{3}-\d{4} | 150-0001 | 1500001(ハイフンなし)・150-001(桁が足りない) |
| 商品コード(大文字英字2字+数字4桁) | [A-Z]{2}\d{4} | AB1234 | ab1234(小文字)・AB123(桁が足りない)・AB12345(桁が多い) |
| メールアドレス(簡易な書式) | [\w.+-]+@[\w-]+(\.[\w-]+)+ | taro@example.com・taro.yamada@mail.example.co.jp | taro@example(ドットがない)・taro@@example.com(@が2つ)・@example.com(@の前が空) |
メールアドレスの式は、「@の前に英数字・ドット・プラス・ハイフンが1文字以上、@、ドメインの名前、ドット区切りの名前が1つ以上」という形を表しています。この式が確かめているのは書式だけで、アドレスの実在や、受信できるかどうかではありません。実際のメールアドレスの規則はもっと複雑なので、式を厳密にしすぎると正しいアドレスを弾いてしまうことがあります。
部分一致と全体一致の違い
同じ式でも、文字列の「どこかに一致すればよい」のか、「全体が一致しなければならない」のかで結果が変わります。郵便番号の式 \d{3}-\d{4} を、桁が1つ多い 150-00012 に当てて比べます。
- 部分一致(検索):先頭から8文字の 150-0001 に一致するので、一致ありになる
- 全体一致(^と$で囲む):^\d{3}-\d{4}$ とすると、末尾の余分な 2 があるため、一致なしになる
商品コードの式 [A-Z]{2}\d{4} も同じです。AB12345 のように桁が多い文字列や、XAB1234 のように前に余分な文字がある文字列は、部分一致では一致ありになりますが、全体一致では一致なしになります。入力の書式を判定したいときは、^と$で囲んで全体を一致させます。
もう一つ注意したいのが数字の範囲です。Pythonの公式ドキュメントでは、\d は文字列に対して既定でUnicodeの数字全般に一致し、ASCIIフラグを使うと [0-9] になると説明しています。実行して確かめると、全角の150-0001 は既定では一致し、ASCIIフラグを付けると一致しませんでした。半角の数字だけを通したいときは、[0-9] と書くか、ASCIIフラグを使います。
できるだけ長く一致する貪欲な一致
*・+・? は、既定ではできるだけ長く一致します。Pythonの公式ドキュメントの例では、<.*> を <a> b <c> に当てると、<a> だけでなく文字列全体に一致します。
文字列: <a> b <c>
<.*> → <a> b <c> (できるだけ長く一致)
<.*?> → <a> (?を付けると、できるだけ短く一致)HTMLのタグを1つずつ取り出したいのに、最初の < から最後の > までが1つの塊として取れてしまう、という失敗はこの性質が原因です。くり返しの後ろに?を付けると、一致する範囲を最短にできます。
DS検定の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
よくある質問
DS検定で、正規表現はどこまで問われますか?
公式スキルチェックリスト(data_engineering.csv)の★1つ星は、正規表現を活用して条件に合致するデータを抽出できることです。例として、メールアドレスの書式を満たしているかの判定が挙げられています。複雑な式を自分で組み立てる力より、記号の意味を読んで、どの文字列に一致するかを判断する力が土台です。
正規表現で、メールアドレスの正しさは確かめられますか?
確かめられるのは書式だけです。このページの式は、@の前後とドットの並びを見るだけの簡易なものです。書式を満たしていても、そのアドレスが実在するか、受信できるかは分かりません。実在の確認は、確認メールを送って反応を見る方法などで別に行います。
部分一致と全体一致は、どう使い分けますか?
データ全体が決まった形かを判定したいときは、全体一致(先頭の^と末尾の$、またはPythonのfullmatch)を使います。文章の中から該当する部分を取り出したいときは、部分一致の検索を使います。^と$を付け忘れると、桁が多すぎる文字列まで通してしまいます。
表計算ソフトのフィルタと、正規表現は何が違いますか?
公式チェックリストでは、表計算ソフトでのフィルタ・ソートなどの基本加工と、正規表現による抽出は別の項目です。フィルタは「A列が東京と等しい」のような条件の指定が中心で、正規表現は「3桁の数字、ハイフン、4桁の数字」のような文字の並びの形で条件を表せます。
