🐍 Python

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.searchとの違い

re.matchは文字列の先頭だけを見るのに対し、re.searchは文字列のどこにあっても一致箇所を探します。「文字列の途中にパターンがあるかもしれない」場合はre.matchではなくre.searchを使うべきで、この2つを混同するとAIが生成したコードが期待通りに動かない原因になります。文字列全体が完全に一致するかを見たい場合はre.fullmatchを使います。

戻り値のMatchオブジェクトからより多くの情報(名前付きグループなど)を取り出す方法は名前付きグループのページで解説しています。

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