概要
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']
知っていればどうということはありませんが、知らないと少し戸惑うというお話。