030:正規表現「.」に\nをマッチさせる
flag 引数で正規表現の挙動を変更
「.」 は普段、改行文字以外のすべての文字にマッチします。 これを改行文字にもマッチするように変更するには flag 引数に re.S もしくは re.DOTALL を渡します。
>>> import re
>>> print re.search(".", "\n")
None
>>> print re.search(".", "\n", re.DOTALL)
<_sre.SRE_Match object at 0x00B3CD08>
Python だと re.S で Ruby だと m 。 与える文字が異なるので両言語使いは注意です。
flag 引数を持たない関数使用時
では、split, sub, subn 関数を使うときにはどうしましょうか? これらには flag 引数がありません。
>>> re.split('a.a', 'cba\nabc') # ダメな例
['cba\nabc']
最も簡単なのは compile 関数を用いて正規表現オブジェクトを作ってしまう方法です。
>>> re.compile('a.a', re.DOTALL).split('cba\nabc')
['cb', 'bc']
4.2.1 正規表現のシンタクス に記述のある (?iLmsux) というシンタクスを使う方法もあります。 正規表現を表す文字列内に (?s) を入れると re.S を指定したのと同じ効果が得られます。
>>> re.split('(?s)a.a', 'cba\nabc')
['cb', 'bc']
(?s) のエスは小文字で re.S のエスは大文字です。
おまけ
flag 引数の出番が他になさそうなので、 その他の便利なフラグもここで紹介します。
- re.I, re.IGNORECASE
- アルファベットの大文字小文字の違いを無視します。
- re.M, re.MULTILINE
- 文字列を複数行扱いします。 具体的には ^ が改行と次の文字の間に、 $ が改行の前の文字と改行の間にもマッチするようになります。 普段はそれぞれ文字列先頭、終端にしかマッチしません。
この他にもフラグはあります。 詳しくは 4.2.3 モジュール コンテンツ を参照してください。