Python: 正規表現での検索フラグ flags

Pythonの正規表現で使うreモジュールのsearch()関数、match()関数、findall()関数 compile()関数などで、指定できる引数の1つに 「検索フラグ(flags)」があります。

search(パターン, 検索対象文字列 [, flags=0])

match(パターン, 検索対象文字列 [, flags=0])

findall(パターン, 検索対象文字列 [, flags=0])

検索フラグのデフォルト値は「flags=0」となっており、何も指定されていませんが、 「大文字小文字を区別する」などの少し複雑な正規表現の場合は検索フラグ (flags)を使用するケースがあります。

検索フラグ(フラグ定数)の値と内容

主な検索フラグの値(フラグ定数)と内容は次表の通りです。

フラグ定数説明
re.ASCIIASCII限定のマッチング
re.IGNORECASE大文字小文字を区別する
re.MULTILINE「^」が各行の先頭にマッチし、「$」が各行の行末にマッチする
re.DOTALL特殊文字「.」を改行を含むあらゆる文字に対応させる。 指定がない場合は改行以外のあらゆる文字とマッチする。
re.VERBOSEパターンにコメントを加えたり、複数行で記述できる

この中でも押さえておきたいのは 「re.IGNORECASE」「re.MULTILINE」「re.DOTALL」の3つです。

フラグの指定方法

フラグを1つ指定する場合は次のように指定します。

書式
m = re.search(パターン, 検索対象文字列, flags=re.DOTALL)

フラグを複数指定する場合は「|」でつなぎます。

書式
m = re.search(p, s, flags=re.DOTALL | re.IGNORECASE)

「re.DOTALL」を使うケース

次のコードはパターン「<p>.*</p>」を指定して、 pタグで囲まれた文字列を取得しようとしてますが、 結果として「None」になっています。

import re

# パターン
p = "<p>.*</p>"

s = """<p>hello
world</p>
"""

m = re.search(p, s)

print(m) # None

検索対象文字列が複数行になっているためうまく取得できませんでした。

複数行に渡る文字列を取得する場合は、 改行にもマッチさせるために「re.DOTALL」を指定します。

import re

# パターン
p = "<p>.*</p>"

s = """<p>hello
world</p>
"""

m = re.search(p, s, flags=re.DOTALL)

print(m.group())

今回はpタグを取得できています。

実行結果
<p>hello
world</p>
Python