🐍 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が付いていない場合、「パターンは合っているはずなのに一致しない」という不可解な挙動の原因になります。正規表現自体は正しいのにテストが失敗するときは、まずフラグの付け忘れを疑ってみてください。