【Python】正規表現でのテキスト抽出。キャプチャグループ:()の役割

テーマは正規表現のキャプチャグループ pythonの話

今回は、Pythonの正規表現を使ったテキストの抽出についてお話しします。特に、パターンに一致する文字列を抽出する方法と、一致する文字列の中で括弧で囲まれた部分だけを抽出する方法の違いについて解説します。

正規表現でのテキスト抽出で()を使ってできること

Pythonの正規表現では、テキスト内から特定のパターンに一致する部分を抽出することができます。
そのためには、まず正規表現のパターンを作成する必要があります。具体的には、re.compile()関数を使ってパターンをコンパイルします。

以下に示す2つのパターンを比較してみましょう。違いは、pattern1とpattern2で「()」が入っているかの違いです。

import re

text = "Pythonは★★正規表現☆☆についての説明です。"
start_tag = "★★"
end_tag = "☆☆"

pattern1 = re.compile(start_tag + ".*?" + end_tag)
pattern2 = re.compile(start_tag + "(.*?)" + end_tag)

match1 = re.search(pattern1, text)
match2 = re.search(pattern2, text)

matches = re.findall(pattern1, text)
for match in matches:
    print(match)

matches = re.findall(pattern2, text)
for match in matches:
    print(match)

pattern1は、start_tagで始まりend_tagで終わる部分全体を抽出するためのパターンです。括弧は使用されていませんので、一致する文字列全体が抽出されます。

一方、pattern2ですが、このパターンは、start_tagとend_tagで挟まれた部分だけを抽出するためのものです。具体的には、start_tagに続く任意の文字列を括弧で囲んでいます。

pattern1を使って抽出を試みると、結果は”★★正規表現☆☆”となります。

pattern2を使って抽出を試みると、結果は”正規表現”となります。「★★正規表現☆☆」がパターンに一致し、そのなかで★★と☆☆で囲まれた部分が抽出されます。

正規表現における「キャプチャグループ」

ここで、括弧の役割について説明します。

正規表現のパターンで、括弧()で囲まれた部分は、正規表現において「キャプチャグループ」と呼ばれます。
キャプチャグループは、一致した文字列の中で特定の部分を個別に抽出したり、後続の処理で利用したりするために使用されます。

括弧で囲まれた部分は、正規表現内でグループ化され、その一致部分は後続の操作で利用可能になります。例えば、以下のようにキャプチャグループを利用することができます。

import re

text = "Date: 2023-05-14"
pattern = re.compile(r"(\d{4})-(\d{2})-(\d{2})")

match = pattern.search(text)
if match:
    year = match.group(1)
    month = match.group(2)
    day = match.group(3)
    print("Year:", year)
    print("Month:", month)
    print("Day:", day)

この例では、正規表現パターン(\d{4})-(\d{2})-(\d{2})を使って、年、月、日を抽出します。\d{4}は4桁の数字、\d{2}は2桁の数字を表しています。括弧に囲まれた部分はキャプチャグループとなり、match.group()メソッドを使って個別にアクセスすることができます。

出力結果は次のようになります。

Year: 2023
Month: 05
Day: 14

こうしたキャプチャグループの利用により、正規表現で一致した文字列の特定の部分を取得し、必要な処理に活用することができます。

コメント

タイトルとURLをコピーしました