使える正規表現パターン集 — 初年目エンジニア向け
音声
目次
正規表現の基本
正規表現(レギュラーエクスプレッション、文字列のパターン検索・抽出を表す式)は、文字列を型のように扱って検索や置換を効率化できる技術です。
ここでは専門用語を必要に応じて簡単に説明しながら、実務で頻出する考え方だけに絞って解説します。
正規表現はツールや言語によって細かな差分があり、例えば改行の扱いやバックスラッシュのエスケープが異なる場合があります。そのため、最初に使う環境の「エンジンのクセ」を確認しておくことが大切です。
エンジンとは正規表現の処理をする実装のことで、環境によって挙動が変わる場合がある点は押さえておくと安心です。
最初は小さなパターンで試し、問題がなければ仕事で応用していく流れが安全です。
よく使うパターンと意味
ここでは現場で頻出する定番パターンを例文とともに説明します。
^ は行頭を表す記号です。$ は行末を表す記号です。. は任意の一文字を意味します。* は直前の要素の0回以上の繰り返しを意味します。+ は1回以上の繰り返しを意味します。? は直前の要素を0回か1回に限定します。
[] は文字クラスで、範囲や複数文字のどれか1文字を指定できます。() はグループ化で後で参照できます。| はOR(どちらか)を意味します。\d は数字、\w は英数字とアンダースコア、\s は空白を表すことが一般的です。
判断のポイントとしては「パターンが短くかつ過学習になっていないか」を見ると良いです。過学習は必要以上に限定して、別の正当な入力を弾いてしまう状況を指します。例えばメールアドレスのバリデーションは簡単な正規表現で十分な場合が多いため、複雑にしすぎないことをおすすめします。
ちょい自動化:短いスクリプト例(Python)
Python(パイソン)でログからエラー行だけ抽出してCSVに出す簡単な自動化例を示します。初年目の方はまず手で1ファイルで実験してから複数ファイルに適用すると進めやすいです。
以下はログファイルからタイムスタンプとエラーメッセージを抜き出す例です。コードを実行する前にテスト用の小さいログを用意すると失敗の切り分けが楽になります。
# !/usr/bin/env python3
import re
import csv
pattern = re.compile(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*(ERROR|WARN)\s*:\s*(.*)')
with open('app.log', 'r', encoding='utf-8') as f, open('errors.csv', 'w', newline='', encoding='utf-8') as out:
writer = csv.writer(out)
writer.writerow(['timestamp','level','message'])
for line in f:
m = pattern.search(line)
if m:
writer.writerow([m.group(1), m.group(2), m.group(3)])
手順(最小のチェックリスト)は次の3点です。
- 小さなログでパターンがマッチすることを確認するとよいです。
- 期待する列がCSVに出力されることを確認するとよいです。
- 実運用前にバックアップをとってから複数ファイルで試すと安心です。
よくあるミスと切り分け(失敗例+原因)
ここでは典型的な失敗例を挙げて、原因と切り分け方を示します。
失敗例1は、バックスラッシュのエスケープ不足でパターンが動かないケースです。原因は、言語ごとに文字列リテラルの扱いが異なることです。切り分けでは、生の正規表現を小さなマッチテストツール(オンラインのテスターや言語のREPL)で実行して確認するとよいです。
失敗例2は、改行をまたぐパターンで . が改行にマッチせず抜けるケースです。原因は、エンジンの「dotall」モード(改行も含める設定)を使っていないことです。切り分けでは、改行を含む短いテキストで実験して、オプションを変えたときの差分を確認するとよいです。
失敗例3は、貪欲な * や + により必要以上に広く取ってしまい、意図した部分が抜けるケースです。原因は量指定子の選択ミスで、解決策は非貪欲(? を付ける)にするか、より具体的な文字クラスに置き換えることです。
これらの切り分けは、小さな例で繰り返しテストするだけでも多くの問題を特定できます。
軽いジョークとして、正規表現は強力な包丁のようなもので、急いで扱うと指も切りやすいですが、うまく使うと作業が早くなる感じです。
注意(ここだけ)
置換や一括適用は、必ずテストファイルやバックアップを用意してから実行してください。
要約
- 正規表現は文字列の検索・抽出・置換を効率化する式ですので、まず小さなテストで動作確認してください。
^や$、.、*、+、?、[]、()、|、\d、\w、\sなどの基本パターンを押さえてから応用してください。- Pythonなどで少し自動化するとログ処理が速くなりますので、まずは短いスクリプトで試してください。
- よくあるミスはエスケープ不足や改行の扱い、貪欲な量指定子の使い方ですので、小さな例で切り分けてください。
- 置換作業では必ずバックアップを用意してから実行してください。