この記事では、Pythonの正規表現をコンパイルする際に、パターンの動作を細かく制御するためのオプションフラグ
について解説します。特に、複数のフラグをどのように組み合わせるかに焦点を当てます。
主要な正規表現フラグ
re.compile()
の第2引数に指定できるフラグにはいくつか種類がありますが、ここでは代表的な3つを紹介します。
re.IGNORECASE
(または re.I
) このフラグを指定すると、正規表現はアルファベットの大文字と小文字を区別しなくなります。'a'
は'A'
にもマッチします。
re.DOTALL
(または re.S
) このフラグを指定すると、ワイルドカード文字であるドット.
が、デフォルトではマッチしない改行文字\n
にもマッチするようになります。
re.VERBOSE
(または re.X
) このフラグを指定すると、正規表現パターン文字列の中に空白文字やコメントを記述できるようになります。これにより、複雑な正規表現を整形して、可読性を大幅に向上させることができます。
フラグの組み合わせ方法
これらのフラグは、単独で使うだけでなく、複数を同時に適用することが可能です。フラグを組み合わせるには、縦線|
(パイプ)、すなわちビット単位のOR演算子を使用します。
import re
# IGNORECASEとDOTALLを組み合わせる例
# re.compile(r'some_pattern', re.IGNORECASE | re.DOTALL)
# 3つすべてを組み合わせる例
# re.compile(r'some_pattern', re.IGNORECASE | re.DOTALL | re.VERBOSE)
組み合わせたフラグの使用例
re.VERBOSE
とre.DOTALL
を組み合わせて、複数行にわたるHTMLタグの中から、特定の属性を持つタグを見つけ出す例を見てみましょう。
import re
html_text = """
<div id="main-content"
class="container">
Some text here.
</div>
"""
# 複雑なパターンをVERBOSEで整形し、DOTALLで改行に対応
pattern = re.compile(r"""
<div\s+ # '<div>'タグと1つ以上の空白にマッチ
id="main-content" # id属性が"main-content"であること
.*? # 任意の文字(改行含む)が非貪欲に続く
> # タグの閉じ'>'にマッチ
""", re.VERBOSE | re.DOTALL)
match = pattern.search(html_text)
if match:
print("指定したidを持つdivタグが見つかりました。")
print(match.group())
実行結果:
指定したidを持つdivタグが見つかりました。
<div id="main-content"
class="container">
re.VERBOSE
によってパターン内にコメントや改行を入れて読みやすくし、re.DOTALL
によって.*?
がタグ内の改行文字にもマッチできるようになりました。もしre.DOTALL
がなければ、このパターンは改行を含む<div>
タグにはマッチしません。
まとめ
re.compile()
のフラグは、正規表現の基本的な動作を変更するための強力なオプションです。re.IGNORECASE
、re.DOTALL
、re.VERBOSE
などを縦線|
で組み合わせることで、大文字小文字を無視し、改行を含み、かつ可読性の高い、柔軟で強力なパターンを構築することができます。