potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

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

参考