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

検索フラグ flags

Pythonの正規表現で使うreモジュールのsearch()関数、match()関数、findall()関数 や、コンパイル済み正規表現オブジェクトのsearch()メソッド、match()メソッド、 findall()メソッドなどで、指定できる引数の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