Pythonの正規表現文字列フラグ

正規表現を扱うメソッドのオプションパラメータの一つとしてフラグを設定するには、以下の構文を使用します:

pythonflags=re.フラグ名

正規表現の主要なフラグ

フラグ 目的
re.IGNORECASE 文字の大文字小文字を区別しない。
re.DOTALL ドットが改行を含む任意の文字にマッチする。
re.I 大文字小文字を区別しない検索を行う。
re.L 現在のロケールに従って単語を検索する。 この解釈は、英字グループ(\w と \W)、および単語境界の挙動(\b と \B)に影響を与える。
re.M 文字 $ がテキスト全体の終わりだけでなく各行の終わりでもマッチするようにし、文字 ^ がテキスト全体の先頭だけでなく各行の先頭でもマッチするようにする。
re.S ドット (.) の意味を改行を含む任意の文字にマッチするように変更する。
re.U 文字をUnicode文字セットに従って解釈する。このフラグは \w, \W, \b, \B の動作に影響する。Python 3以降ではこのフラグがデフォルトで設定されている。
re.X 正規表現の複数行構文を可能にする。パターン内の空白([] 内の空白やバックスラッシュでエスケープされたものを除く)を無視し、エスケープされていない '#' をコメントとして扱う。

例

フラグ re.IGNORECASE を使用すると、文字の大文字小文字を無視できます。その方法を見てみましょう。この例では、正規表現は小文字のみを見つけます:

pythontxt = 'aaa bbb CCC DDD'
res = re.sub('[a-z]+', '!', txt)

print(res)

コードの実行結果:

python'! ! CCC DDD'

例

次に、メソッドの第4パラメータにフラグ re.IGNORECASE を追加すると、正規表現はすべての大文字小文字の文字を検索し始めます:

pythontxt = 'aaa AAA bbb BBB'
res = re.sub('[a-z]+', '!', txt, flags=re.IGNORECASE)

print(res)

コードの実行結果:

python'! ! ! !'

例

正規表現ですべての改行を見つけてみましょう:

pythontxt = '''aaa
  bbb'''
res = re.sub('\n', '!', txt)

print(res)

実行されたコードの結果:

python'aaa!bbb'

例

しかし、すべての文字を置換する必要がある場合、正規表現でドットを使用しても改行はキャプチャされません:

pythontxt = '''aaa
  bbb'''
res = re.sub('.', '!', txt)

print(res)

実行されたコードの結果:

python'!!!
!!!'

例

このエラーを修正するには、フラグ re.DOTALL を適用する必要があります:

pythonres = re.sub('.', '!', txt, flags=re.DOTALL)
print(res)

実行されたコードの結果:

python'!!!!!!!'

例

パラメータには、演算子 + を間に置くことで複数のフラグを渡すこともできます。まず、行末の文字 'a' を置き換えてみましょう:

pythontxt = '''
  aaa
  AAA
  aaa'''
res = re.sub('aaa
, '!', txt)

print(res)

実行されたコードの結果:

python'''
  aaa
  AAA
  !
'''

例

次に、フラグ re.M を設定します:

pythonres = re.sub('aaa
, '!', txt, flags=re.M)
print(res)

実行されたコードの結果:

python'''
  !
  AAA
  !
'''

例

次に、大文字小文字を無視するフラグも適用してみましょう:

pythonres = re.sub('aaa
, '!', txt, flags=re.M+re.IGNORECASE)
print(res)

実行されたコードの結果:

python'''
  !
  !
  !
'''