Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
re.match() / re.search() / re.fullmatch()
正規表現を使った文字列のパターンマッチングを行う関数です。文字列が特定のパターンに一致するかを判定したり、一致した部分を取り出したりできます。
構文
import re # 文字列の先頭でパターンにマッチするか調べます。 m = re.match(パターン, 文字列) # 文字列全体からパターンにマッチする部分を探します。 m = re.search(パターン, 文字列) # 文字列全体がパターンに完全一致するか調べます。 m = re.fullmatch(パターン, 文字列) # マッチオブジェクトから一致した文字列を取得します。 m.group() # マッチ全体を返します。 m.group(1) # 1番目のキャプチャグループを返します。 m.groups() # 全グループをタプルで返します。
関数一覧
| 関数 / メソッド | 概要 |
|---|---|
| re.match(pattern, string) | 文字列の先頭でパターンにマッチするか調べます。先頭以外にパターンがあってもマッチしません。 |
| re.search(pattern, string) | 文字列全体を検索してパターンにマッチする最初の位置を見つけます。先頭以外でもマッチします。 |
| re.fullmatch(pattern, string) | 文字列全体がパターンに完全一致する場合のみマッチします。 |
| m.group() | マッチした文字列全体を返します。引数に整数を指定するとそのキャプチャグループの文字列を返します。 |
| m.groups() | 全キャプチャグループの文字列をタプルで返します。 |
| m.group('名前') | 名前付きキャプチャグループの文字列を返します。 |
| m.start() / m.end() | マッチした範囲の開始・終了インデックスを返します。 |
サンプルコード
import re
# match() は先頭からマッチします。
m = re.match(r'\d+', '123abc')
if m:
print(m.group()) # 『123』と出力されます。
m2 = re.match(r'\d+', 'abc123')
print(m2) # 先頭が数字でないため『None』と出力されます。
# search() は文字列全体を検索します。
m3 = re.search(r'\d+', 'abc123def')
if m3:
print(m3.group()) # 『123』と出力されます。
# fullmatch() は完全一致のみ。
m4 = re.fullmatch(r'\d+', '12345')
print(bool(m4)) # 『True』と出力されます。
m5 = re.fullmatch(r'\d+', '123abc')
print(bool(m5)) # 『False』と出力されます(途中に英字がある)。
# キャプチャグループで部分を取り出します。
m6 = re.search(r'(\d{4})-(\d{2})-(\d{2})', '今日は 2025-04-15 です。')
if m6:
print(m6.group()) # 『2025-04-15』と出力されます。
print(m6.group(1)) # 『2025』と出力されます。
print(m6.group(2)) # 『04』と出力されます。
print(m6.groups()) # 『('2025', '04', '15')』と出力されます。
# 名前付きキャプチャグループを使います。
pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
m7 = re.search(pattern, '2025-04-15')
if m7:
print(m7.group('year')) # 『2025』と出力されます。
print(m7.group('month')) # 『04』と出力されます。
# メールアドレスの形式を検証します。
email = 'user@example.com'
if re.fullmatch(r'[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}', email):
print('有効なメールアドレスです。')
概要
『re.match()』は文字列の先頭のみを調べ、『re.search()』は文字列全体を検索します。先頭かどうかに関わらずパターンを探したい場合は『re.search()』を使います。マッチに失敗した場合はどちらも『None』を返すため、戻り値を if 文で確認してからグループを取り出してください。
正規表現パターンにはPythonの生文字列(『r"..."』)を使うことが推奨されています。生文字列を使うとバックスラッシュをエスケープせずに書けるため、パターンが読みやすくなります。
日本語などのUnicode文字を含む文字列を扱う場合でも、Pythonの正規表現はデフォルトでUnicode対応のため、PHPの『/u』修飾子のような追加設定は不要です。
全マッチの取得は『re.findall() / re.finditer()』を、置換・分割は『re.sub() / re.split() / re.compile()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。