potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

Python3 反復可能オブジェクトの正規表現と一致する部分を数える

Iterable(反復可能オブジェクト)の正規表現と一致する部分を数えるサンプルコードです。collections標準ライブラリのCounterクラスを使用しています。

import re
from collections import Counter

values = ("ab1111", "ab1112", "ac2111", "ac2112", "ad2112", "ad2113")

#正規表現パターンの準備
#このコードでは最初の一致部分を使用します。
pattern = re.compile(r"^a.+(\d\d)$")

#カウンターオブジェクトの作成
#Counterの仕様からジェネレーターは使えないことに注意してください。
#使用すると結果がおかしくなります。
counter = Counter([m.groups()[0] for value in values if (m := pattern.match(value))])

#カウント結果の表示
print(counter)
#> Counter({'12': 3, '11': 2, '13': 1})

#各種情報の表示
print(list(counter.elements())) #> ['11', '11', '12', '12', '12', '13']
print(counter.most_common(0)) #> []
print(counter.most_common(1)) #> [('12', 3)]
print(counter.most_common(2)) #> [('12', 3), ('11', 2)]

Counterは辞書や名前付き引数で初期値も指定できます。詳細は公式ドキュメントを確認してください。

参考