非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【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
なぜ '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 : NGoni? に一致しない。

 

スポンサーリンク

 - Python