Python 正規表現で複数行を置換する

仕事でちょっとしたテキスト処理に正規表現の置換をよく使います。会社では Windows を使っていて Emacs も使いますが普段使いのエディタとしては Mery をメインに使っています。

あるルーティン処理でこれまでは Mery で手動で処理していたものを Python でスクリプトを書いて自動化しようと思い、少し試してみたのですがどうも思ったような動作にならず、試行錯誤していました。結局のところ、フラグの指定など細かいところまでドキュメントを読んでいなかっただけの話で、無事解決できたので記録を残しておきます。

import re

prog = re.compile(r'pattern')
result = prog.sub('replace', 'source')

こういう感じで正規表現をコンパイルして sub メソッドで置換します。

ただ、上記の書き方だと一行ごとでしか検索してくれないのでコンパイル時にフラグを指定する必要がありました。

prog = re.compile(r'pattern', re.MULTILINE)

これでいけるかと思いきや、まだ期待したとおりに動いてくれません。よくよくドキュメントを読むとデフォルトでは . (ドット)は改行文字を含まないので改行文字を含める場合は DOTALL フラグも必要と書いてありました。

prog = re.compile(r'pattern', re.MULTILINE | re.DOTALL)

なので、こう書く必要があったようです。これで試すと hoge.+?fuga というパターンでも無事複数行をまたいで検索できるようになりました。詰まったらドキュメントをちゃんと読みなさい、ということですね。