【Python】正規表現でre.compileを使いこなす方法
2024/12/04
Pythonのre
モジュールは正規表現を使ったテキスト処理をするために便利なツールです。その中でもre.compile
を使うことで、効率的かつわかりやすいコードが書けます。
正規表現(Regular Expression)は、文字列パターンを表現するための記法です。例えば、特定の単語の検索、形式チェック(メールアドレスや電話番号など)、文字列の置換に活用されます。
re.compile
を使うメリット
Pythonで正規表現を扱う場合、re
モジュールの関数(例: re.search
, re.match
)をそのまま使うこともできます。しかし、re.compile
を使うと以下のメリットがあります:
- パターンの再利用が簡単:複数回同じパターンを使うときに効率的。
- 可読性が向上:パターンが変数化され、コードがわかりやすくなる。
- パフォーマンス向上:パターンのコンパイルを1回だけ行うため処理が速くなる。
re.compile
の基本的な使い方
以下はre.compile
の基本的な例です。
import re # 正規表現パターンをコンパイル pattern = re.compile(r'\d+') # 数字にマッチ # 文字列を検索 text = "今日は2024年11月30日です。" matches = pattern.findall(text) print(matches) # 出力: ['2024', '11', '30']
プログラム例: メールアドレスの検証
以下は、メールアドレスの形式をチェックする例です。
import re # メールアドレスの正規表現パターンをコンパイル email_pattern = re.compile(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$') # チェックする関数 def is_valid_email(email): return email_pattern.match(email) is not None # テスト emails = ["example@example.com", "invalid-email@", "@missing-user.com"] for email in emails: print(f"{email}: {'OK' if is_valid_email(email) else 'NG'}")
出力:
example@example.com: OK invalid-email@: NG @missing-user.com: NG
実用例: ログファイルの解析
コンパイル済みパターンを使うと、大量のログデータを効率的に処理できます
import re # ログからエラーメッセージを抽出 log_pattern = re.compile(r'ERROR: (.+)') log_data = """ INFO: System started ERROR: Unable to connect to database INFO: Retry in 5 seconds ERROR: Timeout during operation """ errors = log_pattern.findall(log_data) for error in errors: print(f"Error: {error}")
出力:
Error: Unable to connect to database Error: Timeout during operation
資格試験に出てきそうな例
試験によく出る例として、次のコードを見てみましょう:
import re # 正規表現をコンパイル prog = re.compile(r'py?(th|ers)oni?(a[lmn]|c)?', re.IGNORECASE) # パターン検索 ret = prog.search('The Zen of Python') # これはOK print(ret) # <re.Match object; span=(12, 18), match='Python'> ret = prog.search('pythomian') # これはNG print(ret) # None
パターン r'py?(th|ers)oni?(a[lmn]|c)?'
は次のように解釈されます:
py?
p
の後にy
が0回または1回現れる(py
またはp
にマッチ)。
(th|ers)
th
またはers
のいずれかにマッチ。
oni?
on
に続けてi
が0回または1回現れる(oni
またはon
にマッチ)。
(a[lmn]|c)?
- 以下のどれかが0回または1回現れる:
a
に続いてl
,m
, またはn
のいずれか- 単独の
c
- 以下のどれかが0回または1回現れる:
なぜ 'The Zen of Python'
はマッチするのか?
'The Zen of Python'
に含まれる Python
は次のように正規表現にマッチします:
py
:p
に続けてy
があり、py
にマッチ。th
: 選択肢(th|ers)
でth
を選択。on
:on
に一致し、i
が省略されてもOK。- (末尾のオプション部分はないのでスキップ)
よって、'Python'
にマッチします。
なぜ 'pythomian'
はマッチしないのか?
'pythomian'
は次のように評価されます:
py
: OK。py
にマッチします。th
: OK。(th|ers)
のth
にマッチします。om
: NG。oni?
に一致しない。
スポンサーリンク