Pythonでfindall()とfinditer()を使いこなす方法

この記事では、Pythonの`re`モジュールに含まれる`findall()`と`finditer()`関数の使用例について詳しく説明します。具体的なコード例、その解説、応用例を含めています。

目次

はじめに

Pythonにおいて文字列のパターンマッチングを行う場合、`re`モジュールが頻繁に利用されます。その中でも`findall()`と`finditer()`は、特定のパターンにマッチする部分文字列を見つける際に非常に有用です。この記事では、それぞれの関数がどのように動作するのか、どう使い分けるべきなのかを解説します。

findall()関数の基本

`findall()`関数は、指定したパターンに一致するすべての部分文字列をリストとして返します。

基本的な使い方

import re

pattern = r"\d+"  # 1以上の数字にマッチ
text = "12 apples and 14 oranges"
result = re.findall(pattern, text)

print(result)  # 出力:['12', '14']

こちらのコードでは、文字列”12 apples and 14 oranges”から数字を抽出しています。`findall()`関数は一致するすべての部分文字列(この場合は’12’と’14’)をリスト形式で返します。

複数のグループを指定する

pattern = r"(\d+) (\w+)"
text = "12 apples and 14 oranges"
result = re.findall(pattern, text)

print(result)  # 出力:[('12', 'apples'), ('14', 'oranges')]

ここでは数字とその後に続く単語をグループ化しています。`findall()`関数は、各マッチについてタプルのリストを返します。

finditer()関数の基本

`finditer()`関数は、`findall()`関数とは異なり、マッチオブジェクトのイテレータを返します。これにより、より詳細な情報(例えば、マッチの位置)を得られます。

基本的な使い方

pattern = r"\d+"
text = "12 apples and 14 oranges"
result = re.finditer(pattern, text)

for match in result:
    print(match.group(), match.start(), match.end())
# 出力:
# 12 0 2
# 14 13 15

このコードでは、マッチした部分文字列だけでなく、その開始位置と終了位置も表示しています。

findall()とfinditer()の使い分け

一般的に、`findall()`は結果をすぐにリストとして取得したい場合に、`finditer()`はマッチに関する追加情報が必要な場合に使用されます。

  • findall()は結果をリストで簡単に取得できる
  • finditer()はマッチの詳細情報を得ることができる

応用例

例1: 電話番号の抽出

pattern = r"\d{2,4}-\d{2,4}-\d{4}"
text = "Contact us at 123-456-7890 or 12-34-5678"
result = re.findall(pattern, text)
print(result)  # 出力:['123-456-7890', '12-34-5678']

この例では、様々な形式の電話番号を抽出しています。

例2: HTMLタグの除去

pattern = r"<[^>]+>"
text = "

This is a paragraph.

" result = re.sub(pattern, "", text) print(result) # 出力:This is a paragraph.

この例では、HTMLタグを除去しています。`re.sub()`関数を使い、マッチした部分を空文字列に置き換えています。

まとめ

`findall()`と`finditer()`はPythonの`re`モジュールで非常に便利な関数です。`findall()`は一致する部分文字列のリストを返し、`finditer()`はマッチの詳細情報を提供します。適切な使い分けによって、これらの関数は多くのシナリオで有用です。

コメント

コメントする

目次