静かなる名辞

pythonとプログラミングのこと


【python】正規表現モジュールreで行頭・行末にマッチしないときの対処

概要

 pythonの正規表現モジュールreでは、デフォルトでは^は「文字列の先頭」に、$は「文字列の末尾」にマッチします。

 なので、次のような挙動になります。

>>> s = "hoge\nfuga\n"
>>> import re
>>> re.findall(r"^[hf]|[ea]$", s)
['h', 'a']  # ['h', 'e', 'f', 'a']を期待

 意図している結果と違うので、ちょっと残念な感じです。

対処法

 reモジュールの関数にはflagsという引数を渡すことができます。flagsは実際には正規表現モジュールで定義されている定数で、ビットOR演算子(|)で連結することで複数指定することも可能です。

 「改行ごとに行頭・行末として扱う」ためには、re.MULTILINEを指定します。

re --- 正規表現操作 — Python 3.7.4rc2 ドキュメント

>>> re.findall(r"^[hf]|[ea]$", s, flags=re.MULTILINE)
['h', 'e', 'f', 'a']

 知っていればどうということはありませんが、知らないと少し戸惑うというお話。