re.match(pattern, string, flags=0)
文字列の先頭からパターンに一致するかどうかを調べる関数です。「先頭から」という制約があるため、文字列のどこかに一致箇所があっても、それが先頭でなければNoneが返ります。この「先頭限定」という性質を理解しているかどうかで、AIが生成したバリデーションコードが正しく動くかを判断できるようになります。
構文: re.match(pattern, string, flags=0)
戻り値: 一致すればMatchオブジェクト、一致しなければNone
基本の使い方:先頭一致を確認する
最も基本的な使い方は、文字列の先頭が特定のパターンで始まっているかを調べることです。Matchオブジェクトが返ってきたら、.group()で一致した文字列そのものを取り出せます。
import re
m = re.match(r'\d+', '123abc')
print(m.group()) # '123'
先頭に無ければNoneが返る
ここがre.matchで最も間違えやすいポイントです。パターンが文字列の途中にあっても、先頭でなければ一致しません。戻り値がNoneのまま.group()を呼ぶとAttributeErrorになるため、AIが生成したコードでも一致判定を挟まず.group()を呼んでいないか確認する価値があります。
import re
m = re.match(r'\d+', 'abc123')
print(m) # None(先頭が数字でないため、途中に数字があっても一致しない)
# 安全な書き方:一致したかどうかを先に確認する
if m:
print(m.group())
else:
print('一致しませんでした')
グループで一部分だけ取り出す
パターンの一部を丸括弧(...)で囲むと「グループ」として個別に取り出せます。電話番号や日付のように、決まった形式の文字列から一部分だけ欲しいときに便利です。
import re
m = re.match(r'(\d{3})-(\d{4})', '090-1234')
print(m.group(1)) # '090'
print(m.group(2)) # '1234'
print(m.group(0)) # '090-1234'(group(0)は一致した全体)
フラグを併用する:大文字・小文字を無視する
第3引数にフラグを渡すと、パターンの解釈のしかたを変更できます。re.IGNORECASEは大文字・小文字の違いを無視するフラグで、最もよく使われます。
import re
m = re.match(r'hello', 'HELLO world', re.IGNORECASE)
print(m.group()) # 'HELLO'(大文字・小文字を区別せず一致)
- pattern
- 検索する正規表現パターン(文字列)。バックスラッシュを含むことが多いため
r'...'のraw文字列で書くのが基本 - string
- 検索対象の文字列
- flags(省略可)
- 大文字小文字無視(
re.IGNORECASE)や複数行モード(re.MULTILINE)などの動作オプション。詳しくはflagsのページを参照
re.matchは文字列の先頭だけを見るのに対し、re.searchは文字列のどこにあっても一致箇所を探します。「文字列の途中にパターンがあるかもしれない」場合はre.matchではなくre.searchを使うべきで、この2つを混同するとAIが生成したコードが期待通りに動かない原因になります。文字列全体が完全に一致するかを見たい場合はre.fullmatchを使います。
戻り値のMatchオブジェクトからより多くの情報(名前付きグループなど)を取り出す方法は名前付きグループのページで解説しています。