🐍 Python

reモジュールのフラグ:IGNORECASE / MULTILINE / DOTALL

re.matchやre.findallなどの関数は、最後の引数に「フラグ」を渡すことでパターンの解釈のしかたを変更できます。同じパターン・同じ文字列でも、フラグの有無で結果がまったく変わることがあるため、AIが生成したコードにフラグが付いているかどうかは必ず確認すべきポイントです。

使い方: re.関数名(pattern, string, フラグ)
主なフラグ: re.IGNORECASE(re.I) / re.MULTILINE(re.M) / re.DOTALL(re.S)

re.IGNORECASE:大文字・小文字を区別しない

最もよく使われるフラグです。パターンと文字列の大文字・小文字の違いを無視して一致させます。

import re

print(re.findall(r'python', 'Python PYTHON python', re.IGNORECASE))
# ['Python', 'PYTHON', 'python'](大文字小文字を区別せずすべて一致)

re.MULTILINE:^と$を各行の先頭・末尾として扱う

フラグを付けない場合、^は文字列全体の先頭しか意味しません。re.MULTILINEを付けると、複数行の文字列の中の各行の先頭が^の対象になります。

import re

text = "start\nmiddle\nend"

print(re.findall(r'^\w+', text, re.MULTILINE))
# ['start', 'middle', 'end'](各行の先頭がそれぞれ対象になる)

print(re.findall(r'^\w+', text))
# ['start'](フラグなしだと文字列全体の先頭1件だけ)

re.DOTALL:.(ドット)を改行にも一致させる

通常、.(任意の1文字)は改行文字\nには一致しません。re.DOTALLを付けると、改行をまたいだパターンも.で一致するようになります。

import re

print(re.findall(r'start.end', "start\nend", re.DOTALL))
# ['start\nend'](DOTALLありだと改行も.に含まれる)

print(re.findall(r'start.end', "start\nend"))
# [](DOTALLなしだと改行があるため不一致)

複数のフラグを組み合わせる

複数のフラグを同時に使いたい場合は、|(ビット演算のOR)でつなげます。「大文字小文字を無視しつつ、複数行モードでも検索する」といった組み合わせがよく使われます。

import re

print(re.findall(r'python', 'PYTHON', re.IGNORECASE | re.MULTILINE))
# ['PYTHON'](2つのフラグを同時に適用)
主なフラグ一覧
re.IGNORECASE(略記: re.I)
大文字・小文字の違いを無視して一致させる
re.MULTILINE(略記: re.M)
^と$を、文字列全体ではなく各行の先頭・末尾として扱う
re.DOTALL(略記: re.S)
.(任意の1文字)を改行文字にも一致させる
💡 フラグの付け忘れは「なぜか一致しない」の典型原因

複数行のテキストを処理するAI生成コードで^や$を使っているのにre.MULTILINEが付いていない、あるいは改行を含む長いテキストに.を使っているのにre.DOTALLが付いていない場合、「パターンは合っているはずなのに一致しない」という不可解な挙動の原因になります。正規表現自体は正しいのにテストが失敗するときは、まずフラグの付け忘れを疑ってみてください。

← Python re モジュール リファレンス一覧へ戻る