Python: 正規表現でマッチした文字列をイテレータで取得 finditer()

Pythonの正規表現でマッチ部分をイテレータとして取得する場合は、 finditer()関数を使います。

マッチ部分を文字列のリストとして取得するにはfindall()関数を使いますが、 finditer()はmatchオブジェクトを要素とするイテラブルなオブジェクトとして取得できます。
ここではfinditer()関数の使い方を解説します。

finditer()の書式

書式
finditer(検索パターン, 検索対象文字列 [, flags=0])

引数はsearch()やfindall()と同じように検索パターン、 検索対象文字列の順で指定します。
戻り値は「matchオブジェクト」を要素とするイテレータです。

finditer()のサンプルコード

次のコードは、 HTMLの li 要素のテキスト部分をfinditer()関数を使って取得します。

import re

# パターン
p = "<li>(.*?)</li>"

# 検索対象文字列
s = """<ul>
<li>リストA</li>
<li>リストB</li>
<li>リストC</li>
</ul>
"""

# 検索
itr = re.finditer(p, s)

print(itr)

for m in itr:
	print(m)
	print(m.group(1))

「print(m)」の表示結果で、 各要素にmatchオブジェクトが格納されていることがわかります。
「print(m.group(1)」で li 要素のテキスト部分のみを表示しています。

実行結果
<callable_iterator object at 0x000002C0BBCEF088>
<re.Match object; span=(5, 18), match='<li>リストA</li>'>
リストA
<re.Match object; span=(19, 32), match='<li>リストB</li>'>
リストB
<re.Match object; span=(33, 46), match='<li>リストC</li>'>
リストC

最初からテキスト部分(文字列部分)だけが欲しい場合はfindall()関数を使い、 matchオブジェクトとして取得したい場合はfinditer()関数を使います。

(関連記事: 正規表現でマッチした文字列をリストとして取得 re.findall()

Python