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

Python
スポンサーリンク

概要

用途別の「さらに細かいバリエーション」を実務で使いやすい形で追加します。各テンプレートについて「用途」「正規表現(生文字列 r’…’ 推奨)」「短い説明」「Pythonでの使い方例」「注意点」を示します。必要なら特定フォーマットに合わせて微調整します。


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

  • 用途: 日本国内の代表的な表記パターンを拾う
  • 正規表現:
r""" 
(?x) # verbose 
(?:?0\d1,4?0\d{1,4}?[ \-–.])? # 市外局番 (括弧可)(任意) 
\d{1,4} # 市内/下位ブロック 
(?:[ \-–.]\d{1,4})* # 続くブロック(可変長) 
(?:[ \-–.]ext\.?\s\d{1,5})? # 内線 
(ext.123) 任意 
"""
  • 例(Python):
import re
pattern = re.compile(r"""(?x)
(?:\(?0\d{1,4}\)?[ \-–.]*)?
\d{1,4}
(?:[ \-–.]*\d{1,4})*
(?:[ \-–.]*ext\.?\s*\d{1,5})?
""")
re.findall(pattern, text)
Python
  • 注意: 市外局番や括弧、ハイフン・空白・ピリオドの混在に対応。誤検出ありうるので文脈フィルタ推奨。

2 電話番号 — 日本の携帯(ハイフン有無)、厳密版

  • 用途: 携帯番号のみ(090/080/070/050含む)抽出
  • 正規表現: r”\b(?:0[7-9]0|050)[ -–.]?\d{4}[ -–.]?\d{4}\b”
  • 例:
re.findall(r"\b(?:0[7-9]0|050)[ \-–.]?\d{4}[ \-–.]?\d{4}\b", text)
Python
  • 注意: 050はIP電話。国際表記や市外局番混合は別処理。

3 電話番号 — 国際 E.164(+国コード、数字のみ)

  • 用途: 国際標準 E.164(+81… 等)形式を抽出・検証(最大15桁)
  • 正規表現: r”+[1-9]\d{1,14}\b”
  • 例:
re.findall(r"\+[1-9]\d{1,14}\b", text)
Python
  • 注意: 表示上ハイフンや空白が混じる場合は除去して検査する(例: re.sub(r”[ -]”, “”, s))。

4 電話番号 — 国際表記(区切りあり、国番号から内線まで)

  • 用途: “+81 90-1234-5678 ext 123” のような複合表記を許容
  • 正規表現:
r""" 
(?x) (?P<intl>\+[0-9]{1,3})? # 国番号(任意) 
[ \-.]* # 区切り 
(?:\(?\d{1,4}?[ \-.\)]) # 先頭ブロック 
(?:\d{1,4}[ \-.\)])+ # 残りブロック 
(?:ext\.?|x)[ \-.]?\d{1,6}? # 内線 任意 
"""
  • 例: コンパイルして findall、整形(数字以外除去)で正規化。

5 メールアドレス — IDN対応(Punycode含む実用向け)

  • 用途: 国際ドメイン名を含むメールの抽出(実用的)
  • 正規表現: r”[A-Za-z0-9.!#$%&’*+/=?^`{|}~-]+@[A-Za-z0-9-.~%]+(?:.[A-Za-z0-9-._~%]+)+”
  • 例:
re.findall(r"[A-Za-z0-9.!#$%&'*+/=?^_`{|}~-]+@[A-Za-z0-9\-._~%]+(?:\.[A-Za-z0-9\-._~%]+)+", text)
Python
  • 説明: ローカル部に許される記号を広く認め、ドメイン側はラベル分割に緩めに対応。IDN(日本語ドメイン等)は通常 Punycode(xn--…)で表現されるため、上式で検出可能。
  • 注意: RFC完全準拠ではない(RFC5322は極めて複雑)。厳密検証は email.utils、第三者ライブラリ利用を推奨。

6 メールアドレス — 厳密チェック用(簡易RFC寄せ)

  • 用途: より厳密にローカル部とドメインを分けてチェックする(実務向け)
  • 正規表現:
r""" 
(?x) 
^A-Za-z0-9? 
@ 
(?:A-Za-z0-9?.)+ 
[A-Za-z]{2,63}$ 
"""
  • 例: ドメインのTLD長やラベル長を簡易的にチェックできる。内部で lower() して使うと良い。

7 ドメイン名 — IDN候補(Punycode と Unicode混在)

  • 用途: ASCIIドメインと xn--(Punycode)両対応
  • 正規表現: r”\b(?:[A-Za-z0-9-]+.)+[A-Za-z]{2,63}\b|\bxn--[A-Za-z0-9-]+.\w+\b”
  • 注意: IDN の Unicode 直接表記を扱うなら Unicode 区間を含むパターンに拡張するか、IDNA変換(.encode(‘idna’))で正規化してから比較。

8 IPv4 — 範囲チェック付き(0-255の厳密版)

  • 用途: 実際の IPv4 値だけを抽出(0〜255)
  • 正規表現: r”\b(?:(?:25[0-5]|2[0-4]\d|1?\d{1,2}).){3}(?:25[0-5]|2[0-4]\d|1?\d{1,2})\b”
  • 例:
re.findall(r"\b(?:(?:25[0-5]|2[0-4]\d|1?\d{1,2})\.){3}(?:25[0-5]|2[0-4]\d|1?\d{1,2})\b", text)
Python
  • 注意: 厳密で誤検出が少ない。IPv4範囲チェック不要なら簡易版で可。

9 IPv6 — 簡易抽出(圧縮形式含む)

  • 用途: IPv6 アドレス(:: を含む)を抽出(完全検証は複雑)
  • 正規表現(簡易): r”\b(?:[0-9a-fA-F]{1,4}:){2,7}[0-9a-fA-F]{1,4}\b|\b(?:[0-9a-fA-F]{1,4}:){0,7}::(?:[0-9a-fA-F]{1,4}:){0,7}[0-9a-fA-F]{0,4}\b”
  • 注意: 完全チェックは ipaddress モジュールを使う(推奨)。

10 日付 — ISO 系(年月日+可変区切り・時刻付き)

  • 用途: YYYY-MM-DD[T ]HH:MM(:SS)?Z? のような ISO 形式を抽出
  • 正規表現: r”\b(19|20)\d{2}-/.-/.(?:T t :[0-5]\d(?::[0-5]\d)?)?(?:Z|[+-][01]\d:[0-5]\d)?\b”
  • 注意: うるう年や月ごとの日数厳密判定は datetime.strptime で検証する。

11 通貨・金額 — 記号付き・カンマorスペース区切り

  • 用途: “$1,234.56″、”¥ 1 234” など複数表記を拾う
  • 正規表現: r”\b(?:¥|$|EUR|€)?\s?[+-]?\d{1,3}(?:[,\s]\d{3})*(?:.\d+)?\b”
  • 注意: 記号とロケールは分離して正規化(数値化)する。

12 クレジットカード番号 — フォーマット抽出(Luhnは別処理)

  • 用途: 16桁や15桁をグループ区切りで抽出(検出のみ)
  • 正規表現: r”\b(?:\d{4}[ -]?){3}\d{4}\b|\b\d{15,16}\b”
  • 例: 抽出後に Luhn アルゴリズムで検証すること(セキュリティ注意)。

13 JSONキー・値(鍵だけ・簡易)

  • 用途: 簡単に key を列挙する(厳密解析は json モジュール)
  • 正規表現: r'”\s([A-Za-z0-9_]+)\s“\s*:’
  • 注意: ネストや文字列中のクォート、エスケープを扱うなら json.loads を使う。

14 URL — 国際化ドメイン・ポート・パス・クエリを含む実用版

  • 用途: http/https を中心にポート・パス・クエリまで抽出
  • 正規表現: r”https?://[^\s/$.?#].[^\s]*”
  • 拡張(ポート分離): r”https?://(?P<host>[^:/\s]+)(?::(?P<port>\d{1,5}))?(?P<path>/[^\s]*)?”
  • 注意: 末尾の句読点トリミングや括弧内のURLを扱う工夫が必要。厳密な解析は urllib.parse を推奨。

15 正規表現の安全化のベストプラクティス

  • 生文字列 r”…” を使う(特にバックスラッシュ多用時)
  • 長いパターンは re.VERBOSE で可読化する
  • 抽出→正常化(数字以外削除、idnaエンコード、unicode正規化)→厳密チェック(datetime、ipaddress、int変換等)の順で処理する
  • 個人情報(メール・電話・カード番号)を扱うときはマスキングや保存ルールに注意する
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました