Python講座 / 正規表現で文字列を検索・抽出する

正規表現は文字列のパターンを検索したり、入力全体が一定の形か確認したりする仕組みです。形式が一致しても日付や金額として正しいとは限らないため、抽出、型変換、内容の検証を分けます。

目的に合わせて検索方法を選ぶ

関数 用途
re.search 文字列の途中を含め、一致する部分を探す
re.fullmatch 入力全体の一致を要求する
re.finditer 複数の一致と位置を順に読む

r"..."のようなraw文字列はPythonのエスケープと正規表現のエスケープの混同を減らします。ただし文字列の末尾のバックスラッシュなど、Pythonの文字列構文の制約は残ります。

日付の意味検証とHTML抽出は、日付・時刻・タイムゾーンの扱い方で扱う規則とつながります。

名前付きグループと日付解析を実行する

regex_demo.pyへ全体を保存し、仮想環境でpython regex_demo.pyを実行します。IDと金額を別々の名前付きグループから取得します。

import re
from datetime import date

text = "A001:3500 B002:8000"
pattern = re.compile(r"(?P<id>[A-Z][0-9]{3}):(?P<amount>[0-9]+)")
for match in pattern.finditer(text):
    print(match["id"], int(match["amount"]))
value = "2026-10-17"
if re.fullmatch(r"[0-9]{4}-[0-9]{2}-[0-9]{2}", value):
    print(date.fromisoformat(value))

予想結果です。

A001 3500
B002 8000
2026-10-17

不一致と意味の検証を扱う

検索結果はNoneになることがあるため、グループへアクセスする前に一致の有無を確認します。またsearchは不正な入力全体の一部分に一致する場合もあります。単一の値の形式検証にはfullmatchが適切か検討します。

日付のパターンには2026-99-99も一致します。暦として有効かはdate.fromisoformatで確認してください。HTMLや複雑なCSV全体を一つの正規表現で解析しようとせず、その形式のパーサーを使います。

入力を制限して一条件ずつ試す

A001をa001へ変更して大文字の条件を確認し、金額を-1へ変えて現在のパターンが受け付ける範囲を調べます。2026-02-30は形式には一致しても、日付解析では拒否されます。それぞれ比較後に元へ戻します。

自由な文章から複数の組を取り出す処理と、フォームの単一入力を検証する処理は契約が異なります。信頼できないパターンや、長さ無制限の入力に複雑な入れ子の反復を使うと処理時間が過大になる場合があります。扱うパターンを管理し、入力の長さにも適切な制限を設けます。

re.searchは一致しないとNoneを返します。match = re.search(r"[0-9]+", "no digits") の後ですぐgroupを呼ばず、if match is not None: で分岐します。日付の形式に一致しても2026-02-30は有効な日付ではなく、HTML全体の解析も別の問題です。

関連する公式リファレンス