拡張正規表現について
🧩はじめに
正規表現には複数の「方言」が存在します。grep
で使える拡張正規表現(ERE)は、UNIX系ツール向けに設計された比較的古典的かつ軽量な記法です。
一方、Pythonのre
モジュールや秀丸エディタでは、**Perl互換正規表現(PCRE)**に基づいた、より高機能な正規表現がサポートされています。
🆚主な違いまとめ(ERE vs Python/PCRE)
機能 | ERE(grep -E ) |
Python・秀丸(PCRE系) |
---|---|---|
() でグループ化 |
可能 | 可能 |
` | `(or) | 可能 |
+ (1回以上) |
可能 | 可能 |
? (0回または1回) |
可能 | 可能 |
\d , \w , \s |
❌未対応 | ✅対応(文字クラス) |
(?=...) 先読み |
❌未対応 | ✅対応 |
(?<=...) 後読み |
❌未対応 | ✅対応 |
\1 , \2 などの後方参照 |
grep では❌ |
✅対応(特に置換で重要) |
(?P<name>...) 名前付きキャプチャ |
❌ | ✅Pythonでは対応 |
.*? のような非貪欲マッチ |
❌ | ✅対応 |
\b (単語境界) |
❌ | ✅対応 |
Unicode対応(\u や日本語処理) | ❌(一部環境依存) | ✅Pythonでは強い |
grep
における「拡張正規表現」はあくまでPOSIX標準の範囲であり、PCREとは別物です。Linux上でgrep
に-P
オプションをつけるとPCREに近づけますが、これはGNU grep限定機能です。
🔍例で比較
例1:数字3桁の検索
-
ERE (
grep -E
)grep -E '[0-9]{3}' file.txt
-
Python/秀丸
re.search(r'\d{3}', text)
秀丸では
\d{3}
でOK(\dが使える)
例2:英単語の境界を指定
-
ERE
→\b
(単語境界)をサポートしていない。 -
Python/秀丸
re.search(r'\bword\b', text)
例3:先読みを使って「fooの直後にbarがあるもの」だけ
-
ERE
❌非対応 -
Python
re.search(r'foo(?=bar)', text)
-
秀丸
foo(?=bar)
でOK(ただしバージョンによる)
このように、複雑なパターンやHTML/XMLなどの構造的なデータを扱うときはPCRE(Python/秀丸)の方が圧倒的に有利です。
🧠補足:grepでPCREを使いたいとき
GNU grep限定ですが、-P
オプションでPerl互換正規表現を有効にできます:
grep -P '\d{3}-\d{4}' file.txt
-P
は非標準で、macOSのgrep
では使えないことが多いので注意。
🏁まとめ
-
grep
の拡張正規表現(ERE)は、古典的で軽量な記法だが、機能は限定的。 -
Pythonや秀丸はPCREに基づいており、先読み・後読み・非貪欲・Unicodeなど多機能。
-
複雑なパターンや処理が必要な場合は、PCRE系(Python/秀丸)を使うのがベスト。
-
grep
でもGNU環境下では-P
でPCREを部分的に使える。
もし同じ正規表現を複数ツールで使いたい場合は、PCREに合わせて設計しておくと移植性が高くなるのでおすすめです。必要があれば各ツール間での変換のアドバイスもできます!