Python正規表現:マッチオブジェクトから一致文字列と位置をスマートに取得する方法


 

Pythonの正規表現reモジュールでパターンマッチングを実行すると、結果としてマッチオブジェクトが返されます。このマッチオブジェクトには、単にマッチしたかどうかの情報だけでなく、マッチした具体的な文字列文字列内の位置情報など、詳細な情報が含まれています。この記事では、マッチオブジェクトからこれらの貴重な情報を効率的に取得する方法について解説します。

 

マッチオブジェクトの基本

 

re.match()re.search()が成功すると、re.Match型のマッチオブジェクトが返されます。マッチオブジェクトが返されたら、そのオブジェクトのメソッドを使って詳細情報を取得します。

Python
 
import re

text = "Python is fun!"
# 'Python'を検索
match_obj = re.search(r"Python", text)

if match_obj:
    print(f"マッチオブジェクト: {match_obj}")
    # <re.Match object; span=(0, 6), match='Python'>
else:
    print("マッチしませんでした。")

 

マッチした文字列を取得するgroup()メソッド

 

 

group(): マッチした全体または特定グループの文字列を取得

 

match_obj.group()メソッドは、マッチした文字列全体を取得します。引数にグループ番号(デフォルトは0)を指定することで、正規表現で定義したキャプチャグループ(括弧()で囲まれた部分)の文字列を取得することもできます。

Python
 
import re

text = "My email is test@example.com."
# ドメイン名を取得する正規表現
match_obj = re.search(r"@(\w+\.\w+)", text)

if match_obj:
    # マッチした全体
    print(f"全体のマッチ: {match_obj.group(0)}") # test@example.com
    print(f"全体のマッチ: {match_obj.group()}")   # test@example.com (引数なしはgroup(0)と同じ)

    # 1番目のキャプチャグループ(ドメイン名)
    print(f"ドメイン名: {match_obj.group(1)}")   # example.com

 

複数のグループを一括で取得するgroups()メソッド

 

match_obj.groups()メソッドは、全てのキャプチャグループの文字列をタプルとして取得します。

Python
 
import re

text = "Date: 2023-10-26"
# 年、月、日をキャプチャする正規表現
match_obj = re.search(r"(\d{4})-(\d{2})-(\d{2})", text)

if match_obj:
    print(f"全ての日付要素: {match_obj.groups()}") # ('2023', '10', '26')

    year, month, day = match_obj.groups()
    print(f"年: {year}, 月: {month}, 日: {day}") # 年: 2023, 月: 10, 日: 26

 

マッチした文字列の位置を取得するspan(), start(), end()メソッド

 

 

span(): マッチした部分の開始と終了インデックスを取得

 

match_obj.span()メソッドは、マッチした部分の開始インデックスと終了インデックスをタプル(start, end)返します。終了インデックスは含まれないため、スライス表記text[start:end]で直接文字列を抽出できます。

Python
 
import re

text = "Hello World"
match_obj = re.search(r"World", text)

if match_obj:
    start_idx, end_idx = match_obj.span()
    print(f"開始インデックス: {start_idx}, 終了インデックス: {end_idx}") # 開始インデックス: 6, 終了インデックス: 11
    print(f"抽出文字列: {text[start_idx:end_idx]}") # World

 

start()end(): 開始インデックスと終了インデックスを個別に取得

 

match_obj.start()match_obj.end()は、それぞれマッチした部分の開始インデックスと終了インデックスを個別の整数で返します。

Python
 
import re

text = "Python Programming"
match_obj = re.search(r"Programming", text)

if match_obj:
    print(f"開始位置: {match_obj.start()}") # 7
    print(f"終了位置: {match_obj.end()}")   # 18

 

グループごとの位置情報

 

group(), span(), start(), end()メソッドは、引数にグループ番号を指定することで、特定のキャプチャグループに対する情報を取得することも可能です。

Python
 
import re

text = "Name: John Doe"
# 名前を姓と名でキャプチャ
match_obj = re.search(r"Name: (\w+) (\w+)", text)

if match_obj:
    # 姓(1番目のグループ)の情報
    print(f"姓の文字列: {match_obj.group(1)}") # John
    print(f"姓の開始/終了位置: {match_obj.span(1)}") # (6, 10)

    # 名(2番目のグループ)の情報
    print(f"名の文字列: {match_obj.group(2)}") # Doe
    print(f"名の開始/終了位置: {match_obj.span(2)}") # (11, 14)

 

まとめ

 

マッチオブジェクトは、正規表現マッチングの結果を詳細に分析するための宝庫です。group()groups()span()start()end()といったメソッドを使いこなすことで、必要な文字列やその位置情報を柔軟に抽出し、Pythonでのテキスト処理をより高度に行うことができます。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座