Python正規表現:マッチオブジェクトから一致文字列と位置をスマートに取得する方法
Pythonの正規表現re
モジュールでパターンマッチングを実行すると、結果としてマッチオブジェクトが返されます。このマッチオブジェクトには、単にマッチしたかどうかの情報だけでなく、マッチした具体的な文字列や文字列内の位置情報など、詳細な情報が含まれています。この記事では、マッチオブジェクトからこれらの貴重な情報を効率的に取得する方法について解説します。
マッチオブジェクトの基本
re.match()
やre.search()
が成功すると、re.Match
型のマッチオブジェクトが返されます。マッチオブジェクトが返されたら、そのオブジェクトのメソッドを使って詳細情報を取得します。
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)を指定することで、正規表現で定義したキャプチャグループ(括弧()
で囲まれた部分)の文字列を取得することもできます。
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()
メソッドは、全てのキャプチャグループの文字列をタプルとして取得します。
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]
で直接文字列を抽出できます。
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()
は、それぞれマッチした部分の開始インデックスと終了インデックスを個別の整数で返します。
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()
メソッドは、引数にグループ番号を指定することで、特定のキャプチャグループに対する情報を取得することも可能です。
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爆速講座