🐍 Python

re.fullmatch(pattern, string, flags=0)

文字列の全体がパターンに完全に一致するかどうかを調べる関数です。re.matchは先頭さえ合っていれば残りは無視されますが、re.fullmatchは最初から最後まで丸ごと一致していないとNoneを返します。郵便番号・電話番号・ユーザーIDなど「決まった形式に完全に従っているか」を確認するバリデーション処理でよく使われます。

構文: re.fullmatch(pattern, string, flags=0)
戻り値: 文字列全体が一致すればMatchオブジェクト、一部でもはみ出せばNone

基本の使い方:形式チェック

「3桁の数字、ハイフン、4桁の数字」という決まった形式に文字列全体が従っているかを確認します。

import re

m = re.fullmatch(r'\d{3}-\d{4}', '090-1234')
print(m.group())  # '090-1234'(全体が形式通り)

一部でもはみ出すとNone

re.matchであれば先頭さえ合えば一致してしまう文字列も、re.fullmatchでは末尾の余分な文字が原因で不一致になります。この違いを知らないと、AIが「re.matchでバリデーションしています」と書いたコードが実は末尾の余分な文字を見逃す、という事故につながります。

import re

print(re.fullmatch(r'\d{3}-\d{4}', '090-1234extra'))  # None(末尾に余分な文字)
print(re.match(r'\d{3}-\d{4}', '090-1234extra').group())  # '090-1234'(matchなら先頭さえ合えば一致してしまう)

ユーザーIDの形式バリデーション

「英小文字・数字・アンダースコアのみ」という形式チェックによく使われるパターンです。

import re

print(re.fullmatch(r'[a-z0-9_]+', 'user_01').group())  # 'user_01'(許可された文字のみ)
print(re.fullmatch(r'[a-z0-9_]+', 'User_01'))           # None(大文字Uが許可されていない)

グループと組み合わせて形式チェックと抽出を同時に行う

完全一致を確認しつつ、同時に必要な部分を取り出すこともできます。

import re

m = re.fullmatch(r'(\d{4})-(\d{2})-(\d{2})', '2026-08-09')
if m:
    print('形式OK:', m.group(1), m.group(2), m.group(3))
else:
    print('形式が不正です')
# 形式OK: 2026 08 09
パラメータ
pattern
検索する正規表現パターン(文字列)。raw文字列r'...'で書くのが基本
string
検証対象の文字列(全体が一致するか調べられる)
flags(省略可)
動作オプション。詳しくはflagsのページを参照
💡 バリデーションにはfullmatchが安全

ユーザー入力の形式チェックを行うとき、re.matchやre.searchを使うと、パターンに一致する部分文字列さえあれば「OK」と判定されてしまい、末尾に不正な文字が混入していても検出できません。AIが生成したバリデーションコードがre.matchを使っていたら、それが本当に完全一致チェックとして十分か(パターンの末尾に$を付けているか等)を確認する価値があります。確実に全体一致を検証したいならre.fullmatchを使うのが最も安全です。

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