【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?に一致しない。
スポンサーリンク