概要
Pythonで正規表現を使うと文字列から「特定のパターン」を探したり取り出したり置換したりできます。ここでは、よく使うパターンを「テンプレート」として集め、使い方(reモジュールの簡単なコード例)とポイントを初心者にもわかりやすくまとめます。
使い方の基本(最小コード)
- import と簡単な関数の例
import re
text = "対象文字列"
pattern = r"ここに正規表現"
# 部分一致(最もよく使う)
m = re.search(pattern, text)
if m:
print("見つかった:", m.group())
# 全件抽出
all_matches = re.findall(pattern, text)
print(all_matches)
# 置換
new_text = re.sub(pattern, "置換後", text)
print(new_text)
Pythonよく使うメタ文字・記号(要点)
- . 任意の1文字(改行を除く)
- ^ 行頭、$ 行末
- [] 文字クラス(例: [0-9], [a-zA-Z])
- \d 数字、\w 単語文字(英数字と _ )、\s 空白文字
- 1回以上、* 0回以上、? 0回か1回、{n,m} 回数指定
- () グループ化、(?P<name>…) 名前つきグループ
- ?:/?: 指定子や非捕獲グループ、(?=…) 前方参照(先読み)、(?!…) 否定先読み
テンプレート集(用途別)
各項に「用途」「正規表現」「Pythonでの使い方例」「ポイント」を示します。
1) メールアドレス(簡易)
- 正規表現(テンプレート): r”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}”
- 例:
pattern = r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"
emails = re.findall(pattern, text)
Python- ポイント: 実運用では非常に多様なケースがあり、これは「簡易チェック」用。
2) 日本の携帯電話(ハイフンあり)
- 正規表現: r”\b0[789]0-\d{4}-\d{4}\b”
- 例:
pattern = r"\b0[789]0-\d{4}-\d{4}\b"
phones = re.findall(pattern, text)
Python- ポイント: 固定のフォーマット(ハイフンあり)を想定。ハイフンなしは別パターン。
3) 一般的な電話番号(ハイフン任意)
- 正規表現: r”\b0\d{1,4}-?\d{1,4}-?\d{4}\b”
- 例:
pattern = r"\b0\d{1,4}-?\d{1,4}-?\d{4}\b"
phones = re.findall(pattern, text)
Python- ポイント: 可変長の市外局番などを許容する簡易版。
4) URL(http/https)
- 正規表現: r”https?://[^\s/$.?#].[^\s]*”
- 例:
pattern = r"https?://[^\s/$.?#].[^\s]*"
urls = re.findall(pattern, text)
Python- ポイント: シンプルな抽出用。厳密チェックではさらに細分化する。
5) 日付(YYYY-MM-DD)
- 正規表現: r”\b(20\d{2})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])\b”
- 例:
pattern = r"\b(20\d{2})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])\b"
dates = re.findall(pattern, text) # タプル (年, 月, 日) が返る
Python- ポイント: 月・日の簡易バリデーションを含む。うるう年判定まではしない。
6) IPv4 アドレス(簡易)
- 正規表現: r”\b(?:\d{1,3}.){3}\d{1,3}\b”
- 例:
pattern = r"\b(?:\d{1,3}\.){3}\d{1,3}\b"
ips = re.findall(pattern, text)
Python- ポイント: 0〜255 の厳密チェックは別途必要。簡易抽出用。
7) 16進カラーコード(#RRGGBB)
- 正規表現: r”#([A-Fa-f0-9]{6})\b”
- 例:
pattern = r"#([A-Fa-f0-9]{6})\b"
colors = re.findall(pattern, text) # キャプチャで6桁だけ取得
Python- ポイント: 先頭の # を含めたい場合は group を変える。
8) 数値(整数・符号付き)
- 正規表現: r”[+-]?\d+”
- 例:
pattern = r"[+-]?\d+"
nums = re.findall(pattern, text)
Python- ポイント: 浮動小数点が必要なら r”[+-]?\d+(?:.\d+)?”
9) 英単語(単語境界)
- 正規表現: r”\b[a-zA-Z]+\b”
- 例:
pattern = r"\b[a-zA-Z]+\b"
words = re.findall(pattern, text)
Pythonグループ、名前つきグループ、先読みのテンプレート
- キャプチャグループ: r”(\d{4})/(\d{2})/(\d{2})” → groups() で年/月/日を取得
- 名前つきグループ: r”(?P
\d{4})-(?P \d{2})-(?P \d{2})” - 取得: m.group(“year”)
- 前方肯定先読み: r”(?<=ID:)\d+” → ID: に続く数字だけを抽出
- 前方否定先読み: r”\b(?!The)\w+\b” → “The” で始まらない単語を抽出
例(名前つきグループ):
pattern = r"(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})"
m = re.search(pattern, text)
if m:
print(m.group("year"), m.group("month"), m.group("day"))
Pythonフラグとマルチライン処理
- re.I / re.IGNORECASE 大文字小文字を無視
- re.M / re.MULTILINE ^ と $ を行ごとにマッチ
- re.S / re.DOTALL . が改行にもマッチする
- 例: re.search(pattern, text, flags=re.I|re.M)
m = re.search(r"^error:", text, flags=re.I|re.M)
Pythonテスト用ワンライナー(確認スニペット)
- マッチ確認:
import re
print(bool(re.search(r"pattern", "対象文字列")))
Python- グループ取得:
m = re.search(r"(\d{3})-(\d{4})-(\d{4})", "090-1234-5678")
if m:
print(m.groups()) # ('090','1234','5678')
Pythonよくある注意点とコツ
- 生の文字列 r”…” を使う(バックスラッシュをそのまま扱える)
- 「簡易テンプレート」は万能ではない。実運用なら境界ケースを考慮して調整する
- 抽出後に型変換(int化、日付化)や追加のバリデーションを行う
- 長い正規表現はコメント付きで re.VERBOSE を使うと読みやすい
例(VERBOSE):
pattern = re.compile(r"""
^ # 行頭
(?:\+81|0) # 国番号 or 0
\d{1,4} # 市外局番
-?
\d{1,4}
-?
\d{4}
$ # 行末
""", re.VERBOSE)
Python練習課題(実践で慣れる)
- テキストからすべてのメールアドレスを取り出すコードを書いて実行する。
- ログファイルから “ERROR: ” で始まる行だけを抽出する(re.M を利用)。
- テキスト中の yyyy/mm/dd 形式の日付を見つけて、年だけをリストにする。
