Pythonの正規表現で設定できるフラグの一覧

正規表現ではフラグ(またはオプション)を設定することで文字列がパターンにマッチする仕組みを変更することができます。ここでは Python で設定可能なフラグの種類と、それぞれのフラグの使い方について解説します。

(Last modified: )

Pythonでフラグの設定方法

Python で正規表現パターンにフラグを設定する方法は三つあります。一つ目はパターンをコンパイルするときに二番目の引数にフラグを設定する方法、二つ目はパターンを記述するときにパターンの先頭にフラグを記述する方法、三つめはパターンを記述するときに一部のパターンにだけ適用するフラグを記述する方法です。

パターンをコンパイルする時にフラグを指定する

一つ目の方法です。パターンをコンパイルして Pattern クラスのインスタンスを生成するには re モジュールに含まれる compile 関数を使いますが、書式は次のようになっていました。

re.compile(pat, flags=0)

省略可能な二番目の引数にフラグを指定します。例えば re.ASCII フラグを指定する場合は次のように記述します。

pattern = re.compile(r'A.+B', re.ASCII)

複数のフラグを設定する場合は、縦棒(|)を使って複数のフラグを指定してください。

pattern = re.compile(r'A.+B', re.ASCII|re.MULTILINE)

この方式の場合はフラグはパターン全体に適用されます。

パターンの先頭にフラグを記述する

二つ目の方法です。パターンを記述するときにパターンの先頭にフラグを記述します。

r'(?フラグ)パターン'

フラグのところには a i L m s u x の 7 種類のフラグを表す文字を指定します。複数指定する場合は続けて記述します。

r'(?a)A.+B'    // re.ASCII
r'(?am)A.+B'   // re.ASCII + re.MULTILINE

この方式の場合はフラグはパターン全体に適用されます。

パターンの一部に対して適用するフラグを記述する

三つ目の方法です。パターンを記述するときにパターンの一部分にのみ適用するフラグを記述します。(Python 3.6 で追加された機能です)。

r'パターン(?フラグ:パターン)'

フラグを設定する場合は a i L m s u x の 7 種類のフラグを表す文字を指定します。全体に適用されているフラグをこの部分だけ解除する場合は - のあとに i m s x の 4 種類のフラグを表す文字列を指定します。

下記はパターンの中の一部分だけに re.ASCII を設定しています。

r'[a-z]{4}-(?a:[a-z]{4})'

下記はパターン全体に re.ASCII が設定されているときに、一部分だけ re.ASCII を解除しています。

r'(?a)[a-z]{4}-(?-a:[a-z]{4})'

下記はパターン全体に re.ASCII が設定されているときに、一部分だけ re.ASCII を解除し re.MULTILINE を設定しています。

r'(?a)[a-z]{4}-(?m-a:[a-z]{4})'

この方式を使用することで、パターンの中の一部分だけにフラグを設定したり解除できます。

Pythonの正規表現で利用できるフラグの種類

次に Python で用意されているフラグの種類と説明です。 7 種類のフラグが用意されています。

フラグ別名インライン説明
re.ASCIIre.A(?a)メタ文字の \w 、\b 、\d 、\s がASCII文字だけにマッチするようになります。
re.DEBUG----パターンに関するデバッグ情報を表示する。
re.IGNORECASEre.I(?i)パターンで大文字と小文字を区別しなくなります。
re.LOCALEre.L(?L)メタ文字の \w 、 \b および大文字・小文字を区別しないマッチングを、現在のロケールに依存させます。
re.MULTILINEre.M(?m)複数行モード。メタ文字の ^ や $ が文字列の先頭と末尾だけでなく、各行の先頭と末尾にもマッチするようになります。
re.DOTALLre.S(?s)メタ文字の . が改行文字にもマッチするようになります。
re.VERBOSEre.X(?x)パターンの中でコメントが記述できるようになります。

それでは re.DEBUG と re.LOCALE 以外のフラグについてより詳しく見ていきます。

re.ASCIIフラグ

re.ASCII フラグを設定すると、メタ文字の \w 、\W 、\b 、\B 、\d 、\D 、\s 、 \S が ASCII 文字限定でマッチするようになります。

re.ASCII の代わりに re.A も使用できます。またパターンに直接記述する場合は (?a) を使用します。

※ re.ASCII の代わりに re.A も使用できます。またパターンに直接記述する場合は (?a) を使用します。

デフォルトでは次のような文字にマッチします。

\d  Unicode 10 進数字([0-9]とその他の数字)
\D  数字以外 [^\d]
\w  Unicode 単語文字([a-zA-Z0-9_]とその他の単語になるほとんどの文字)
\W  英数字とアンダーバー以外 [^\w]
\s  Unicode 空白文字([ \t\n\r\f\v]とその他の空白文字)
\S  空白文字以外 [^\s]

re.ASCII フラグを設定することで、 ASCII 文字にのみマッチするようになります。

\d  [0-9]
\D  数字以外 [^\d]
\w  [a-zA-Z0-9_]
\W  英数字とアンダーバー以外 [^\w]
\s  [ \t\n\r\f\v]
\S  空白文字以外 [^\s]
サンプルコード

簡単なサンプルで試してみます。

import re

pattern = re.compile(r'\w{4}')

print(bool(pattern.search('ABCD')))
>> True
print(bool(pattern.search('花鳥風月')))
>> True

pattern = re.compile(r'\w{4}', re.ASCII)

print(bool(pattern.search('ABCD')))
>> True
print(bool(pattern.search('花鳥風月')))
>> False

re.ASCII フラグを設定することで \w が ASCII 文字のみの [a-zA-Z0-9_] として扱われるようになりました。

re.IGNORECASEフラグ

re.IGNORECASE フラグを設定すると、パターンの中で記述したアルファベットの大文字と小文字を区別しなくなります。

re.IGNORECASE の代わりに re.I も使用できます。またパターンに直接記述する場合は (?i) を使用します。

例えば次の 3 つのパターンは同じ文字列にマッチします。

pattern = re.compile(r'[a-zA-Z]')
pattern = re.compile(r'[a-z]', re.IGNORECASE)
pattern = re.compile(r'[A-Z]', re.IGNORECASE)
サンプルコード

簡単なサンプルで試してみます。

import re

pattern = re.compile(r'flower')

print(bool(pattern.search('flower')))
>> True
print(bool(pattern.search('Flower')))
>> False
print(bool(pattern.search('FLOWER')))
>> False

pattern = re.compile(r'flower', re.IGNORECASE)

print(bool(pattern.search('flower')))
>> True
print(bool(pattern.search('Flower')))
>> True
print(bool(pattern.search('FLOWER')))
>> True

re.IGNORECASE フラグを設定することでパターンの中の大文字と小文字が区別されなくなりました。

re.MULTILINEフラグ

re.MULTILINE フラグを設定すると、メタ文字の ^ や $ が文字列の先頭と末尾以外に、行の先頭と末尾にもマッチします。

re.MULTILINE の代わりに re.M も使用できます。またパターンに直接記述する場合は (?m) を使用します。

サンプルコード

簡単なサンプルで試してみます。

import re

msg = """Today we're studying JavaScript.
Tomorrow will study the TypeScript."""

pattern = re.compile(r'\w{4}Script\.$')

result = pattern.findall(msg)
print(result)
>> ['TypeScript.']

pattern = re.compile(r'\w{4}Script\.$', re.MULTILINE)

result = pattern.findall(msg)
print(result)
>> ['JavaScript.', 'TypeScript.']

re.MULTILINE フラグを設定することで $ が文字列の末尾だけでなく行の末尾にもマッチするようになりました。

re.DOTALL

re.DOTALL フラグを設定すると、メタ文字の . が改行にもマッチします。

re.DOTALL の代わりに re.S も使用できます。またパターンに直接記述する場合は (?s) を使用します。

サンプルコード

簡単なサンプルで試してみます。

import re

msg = """彼の住所は東京都中央区
日本橋です。"""

pattern = re.compile(r'<span>.*</span>')
print(bool(pattern.search(msg)))
>> False

pattern = re.compile(r'<span>.*</span>', re.DOTALL)
print(bool(pattern.search(msg)))
>> True

re.DOTALL フラグを設定することで . が改行にもマッチするようになりました。

re.VERBOSE

re.VERBOSE フラグを設定すると、パターンの中にコメントを記述することができます。

re.VERBOSE の代わりに re.X も使用できます。またパターンに直接記述する場合は (?x) を使用します。

具体的にはパターンの行の中で \# 以外の # が記述されていると、 # から行末まではコメントとして扱われ無視されます。また空白についても文字クラスの中やバックスラッシュのあと以外では無視されます。

例えば次のようなパターンで試してみます。

pattern = re.compile(r'[a-zA-Z]{2}-[0-9]{3}')

re.VERBOSE フラグを設定すると次の用意パターンに対してコメントを記述できます。

pattern = re.compile(r"""[a-zA-Z]{2}  # 製品名
                         -            # ハイフン
                         [0-9]{3}     # 製品番号""", re.VERBOSE)

このようにパターンを分割してコメントを記述することで、複雑なパターンであってもどの部分が何を意味しているのか明確にすることができます。

サンプルコード

簡単なサンプルで試してみます。

import re

pattern = re.compile(r"""[a-zA-Z]{2}  # 製品名
                         -            # ハイフン
                         [0-9]{3}     # 製品番号""", re.VERBOSE)

print(bool(pattern.search('AZ-243')))
>> True

コメントが記述されていてもパターンが問題なく動作していることが確認できました。

-- --

Python で設定可能なフラグの種類と、それぞれのフラグの使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。