この記事では、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()`はマッチの詳細情報を提供します。適切な使い分けによって、これらの関数は多くのシナリオで有用です。
コメント