home changes contents help options

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 モジュール コンテンツ を参照してください。

参考