Python | 正規表現テンプレート集

Python
スポンサーリンク

テストケース集(マッチする / マッチしない)

以下は先に示した「さらに細かいバリエーション」から主要パターンを抜粋し、実際に試すための短いマッチ/非マッチ例を並べたものです。各例はそのまま re.search や re.findall で試してください(生文字列 r”…” で使うことを推奨)。


1 日本向け電話番号(多形式対応・拡張)

  • パターン(簡略示唆): 括弧・ハイフン・空白・ext を許可する柔軟パターン
  • マッチする:
    • 03-1234-5678
    • (045) 123 4567
    • 0120 12 3456
    • 03.1234.5678 ext.123
  • マッチしない:
    • abc-1234-5678
    • 123456 (明らかに短すぎる)
    • +81-3-1234-5678(国際表記は別扱いにしたい場合)

2 日本の携帯(ハイフン有無・厳密)

  • パターン: r”\b(?:0[7-9]0|050)[ -–.]?\d{4}[ -–.]?\d{4}\b”
  • マッチする:
    • 090-1234-5678
    • 08012345678
    • 050 1234 5678
  • マッチしない:
    • 070-123-4567(ブロック長が不正)
    • 091-1234-5678(090/080/070/050以外)

3 国際 E.164(+国番号・数字のみ)

  • パターン: r”+[1-9]\d{1,14}\b”
  • マッチする:
    • +819012345678
    • +14155552671
  • マッチしない:
    • 0819012345678(先頭に + がない)
    • +012345(国コードは0で始まらない)

4 国際表記(区切りあり・内線含む)

  • パターン(概念): 国番号・区切り・内線を許容する複合パターン
  • マッチする:
    • +81 90-1234-5678
    • +44 (20) 1234 5678 x123
    • +1-415-555-2671 ext 45
  • マッチしない:
    • 90-1234-5678(国番号必須の文脈なら不可)
    • +81-abc-def-ghij(数字以外のブロック)

5 メールアドレス(IDN候補・Punycode含む)

  • パターン(実用型): ローカル部に多数記号、ドメインに xn-- 等許容
  • マッチする:
    • user@example.com
    • user.name+tag@sub.example.co.jp
    • 名字@xn--wgv71a119e(Punycode を含む例)
  • マッチしない:
    • user@@example.com(@が2つ)
    • user@-example.com(ラベル先頭が – の場合)
    • “quoted”@example (簡易パターンでは未対応の特殊ローカル部)

6 メールアドレス(厳密寄せ)

  • パターン(RFC寄せ簡易)
  • マッチする:
    • a@example.com
    • long_local-part_123@example-domain.co
  • マッチしない:
    • .startdot@example.com(先頭ドット禁止)
    • user@toolongtld.abcdefghijklmnop(TLDの長さ超過想定)

7 ドメイン名(IDN候補)

  • パターン: ASCII ドメイン / xn-- を許容
  • マッチする:
    • example.com
    • sub.example.co.jp
    • xn--wgv71a119e.jp
  • マッチしない:
    • example..com(連続ドット)
    • -example.com(ラベル先頭が -)

8 IPv4(0-255 範囲チェック付き)

  • パターン: 0–255 を厳密にチェックするパターン
  • マッチする:
    • 192.168.0.1
    • 0.0.0.0
    • 255.255.255.255
  • マッチしない:
    • 256.100.1.1(256 は範囲外)
    • 01.02.03.04(先頭ゼロ許容/扱いに注意する文脈あり)

9 IPv6(簡易・圧縮含む)

  • パターン(簡易): 16ビットブロックの繰り返し+ :: 形式を許容
  • マッチする:
    • 2001:0db8:85a3:0000:0000:8a2e:0370:7334
    • fe80::1
    • ::1
  • マッチしない:
    • 2001:db8:::1(:: の異常連続)
    • 2001:db8:85a3:z:0:8a2e:0370:7334(16進以外含む)

10 ISO系日時(可変区切り・時刻・タイムゾーン許容)

  • パターン: YYYY-MM-DD[T ]HH:MM(:SS)?(Z|±HH:MM)?
  • マッチする:
    • 2023-07-15
    • 2023/07/15 12:34
    • 2023-07-15T23:59:59Z
    • 2023-07-15T09:30+09:00
  • マッチしない:
    • 2023-13-01(13月)
    • 20230715(区切りなしは未対応のパターン)

11 通貨・金額(記号・カンマ・スペース対応)

  • パターン: 記号オプション + カンマorスペース桁区切り + 小数部任意
  • マッチする:
    • $1,234.56
    • ¥ 1 234
    • EUR1234.5
  • マッチしない:
    • 1,23,4(不正なカンマ位置)
    • $- (記号のみ、数値なし)

12 クレジットカード風(フォーマット抽出)

  • パターン: 4桁グループ x4 または 15–16 桁
  • マッチする:
    • 4111 1111 1111 1111
    • 4111111111111111
    • 3782-822463-10005 (AMEX 15桁をハイフンで)
  • マッチしない:
    • 1234 567 890(桁数不足)
    • 4111 1111 1111 111X(数字以外混入)

13 JSONキー抽出(簡易)

  • パターン: r'”\s([A-Za-z0-9_]+)\s“\s*:’
  • マッチする (抽出されるキー):
    • “name”: -> name
    • “user_id” : -> user_id
  • マッチしない:
    • “complex key name”:(スペース含むキーは未対応)
    • ‘single-quoted’:(シングルクォートのキーは未対応の簡易版)

14 URL(ポート・パス・クエリ含む実用版)

  • パターン(概念): scheme://host(:port)?(/path)?(?query)?
  • マッチする:
    • http://example.com
    • https://example.com:8080/path/to/page?x=1&y=2
    • https://xn--wgv71a119e.jp/パス(URL 中の Punycode 部分は host 部に適合)
  • マッチしない:
    • www.example.com(スキームが必須のパターンなら非マッチ)
    • http:/example.com(スラッシュ数不足)

15 ファイルパス(Windows・厳密)

  • パターン: ドライブレター + \ + ラベル群(禁止文字排除)
  • マッチする:
    • C:\Users\Alice\Documents\file.txt
    • D:\a\b\c\
  • マッチしない:
    • C:Users\Alice(バックスラッシュ欠如)
    • C:\inva|id\name.txt(禁止文字 | を含む)

使い方メモ

  • まずは re.search(pattern, s) で True/False を確認し、re.findall で抽出結果を確認してください。
  • テストは「正常系(マッチする)」「異常系(類似だがマッチしない)」の両方を用意すると良いです。
  • 実運用では抽出後に正規化(空白・ハイフン除去、IDNA変換、datetime/parsing、Luhn等)と追加検証を必ず行ってください。
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました