メインコンテンツへスキップ

拡張正規表現について

🧩はじめに

正規表現には複数の「方言」が存在します。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に合わせて設計しておくと移植性が高くなるのでおすすめです。必要があれば各ツール間での変換のアドバイスもできます!