Pythonの re モジュールで re.search() や re.match() を実行すると、マッチが成功した場合に Match オブジェクトが返されます。このオブジェクトは、単に「マッチしたかどうか」だけでなく、「どこにマッチしたか」「具体的にどの文字列がマッチしたか」という詳細な情報を保持しています。
ここでは、Match オブジェクトから情報を引き出すための主要なメソッドと、その具体的なコード例を解説します。
目次
Matchオブジェクトの主要メソッド
マッチした結果に対して以下のメソッドを使用することで、開始位置や終了位置、キャプチャしたグループの内容などを取得できます。
| メソッド | 戻り値の型 | 説明 |
group() | str | マッチした文字列全体(または指定したグループ)を返します。 |
groups() | tuple | パターン内にグループ () がある場合、全てのグループのマッチ文字列をタプルで返します。 |
start() | int | マッチした文字列の開始インデックスを返します。 |
end() | int | マッチした文字列の終了インデックスを返します。 |
span() | tuple | マッチした文字列の (開始位置, 終了位置) のタプルを返します。 |
実装例:製品コードの抽出と位置特定
テキストデータの中から、特定のフォーマット(例:英字4文字-数字4桁)を持つ製品コードを検索し、その詳細情報を取得する例を紹介します。
ソースコード
import re
# 解析対象のテキスト
text = "New product released: PROD-2025 is available now."
# 正規表現パターン
# (PROD) と (\d{4}) の2つのグループを定義しています
pattern = r"(PROD)-(\d{4})"
# 正規表現検索を実行
m_obj = re.search(pattern, text)
if m_obj:
# 1. マッチした文字列全体を取得
print(f"Match content : {m_obj.group()}")
# 2. マッチした位置情報を取得
print(f"Start index : {m_obj.start()}")
print(f"End index : {m_obj.end()}")
print(f"Span tuple : {m_obj.span()}")
# 3. グループごとの文字列を取得
# groups() はすべてのグループをタプルで返します
print(f"Groups : {m_obj.groups()}")
# group(n) で個別のグループを取得(1始まり)
print(f"Group 1 (Code): {m_obj.group(1)}")
print(f"Group 2 (Year): {m_obj.group(2)}")
else:
print("No match found.")
実行結果
Plaintext
Match content : PROD-2025
Start index : 22
End index : 31
Span tuple : (22, 31)
Groups : ('PROD', '2025')
Group 1 (Code): PROD
Group 2 (Year): 2025
解説
位置情報の取得
start()とend()を使用することで、元の文字列のどこにパターンが存在するかを正確に特定できます。これは、ハイライト表示や文字列の置換処理を独自に行う際に役立ちます。span()は(start(), end())と等価なタプルを返すため、スライス操作(例:text[s:e])を行う際に便利です。
グループの取得
group()は引数を省略(または0を指定)すると、マッチした全体を返します。groups()は定義されたサブグループ(丸括弧で囲まれた部分)のみを抽出するため、構造化されたデータのパースに適しています。
