HOWTO · Python
Python で文字列内の文字の出現をカウントする
Python の文字列に含まれる文字を `str.count()` で数える方法と、`Counter`、ループ、正規表現を使う方法を紹介します。
このページの内容
Python の文字列に含まれる文字を数えるには、str.count() を使います。このメソッドでは大文字と小文字が区別され、部分文字列も数えられます。ただし、部分文字列の重なりは数えません。すべての文字の出現回数を調べる場合は collections.Counter、独自の処理を加える場合はループ、パターンに一致する文字列を探す場合は正規表現を使います。
str.count() で1種類の文字を数える
組み込みの文字列メソッド str.count() は、指定した文字や部分文字列を数える最も簡単な方法です。検索対象の文字列を渡すと、重ならない一致の数を返します。大文字と小文字は区別されるため、"p" と "P" は別々に数えられます。
次の例では、短い文字列に含まれる小文字の l を数えます。text と target を任意の値に置き換えてください。複数文字の対象を指定した場合も、同じメソッドで重ならない部分文字列の一致数を数えられます。
text = "hello, world!"
target = "l"
count = text.count(target)
print(count)
たとえば、"aaaa".count("aa") は 2 です。一致箇所が重ならないものとして数えるためです。部分文字列の重なりも数えたい場合は、パターンを使う方法を選び、期待する一致方法を明示してください。
collections.Counter ですべての文字を数える
Python の collections モジュールにある collections.Counter は、文字列を含むイテラブルから文字の出現回数を集計します。1文字だけでなく複数の文字の回数を調べたい場合に便利です。特定の文字の回数は角括弧で取り出せます。入力に含まれない文字の回数は 0 になります。
from collections import Counter
text = "hello, world!"
counts = Counter(text)
print(counts["l"])
print(counts)
最初の参照では指定した1文字の回数を取得でき、Counter オブジェクトには文字列全体の各文字の回数が含まれています。counts.most_common() を使うと、出現回数の多い項目を確認できます。この方法は Python の標準ライブラリだけで使えるため、NumPy などのサードパーティ製パッケージは必要ありません。
ループや内包表記で数える
明示的なループを使うと、比較や加算の手順がわかりやすくなります。数える際に追加の条件を適用したり、独自の処理を行ったりする場合に便利です。個々の文字を数えるときは、対象を1文字の文字列にしてください。
text = "hello, world!"
target = "l"
count = 0
for character in text:
if character == target:
count += 1
print(count)
もう少し簡潔に書くには、ジェネレーター式と sum() を組み合わせます。一致する文字ごとに1を加算するため、中間リストを作る必要はありません。
text = "hello, world!"
target = "l"
count = sum(character == target for character in text)
print(count)
ループとジェネレーターは、1文字を対象にする場合、str.count() と同じように文字を比較します。そのため、大文字と小文字も区別されます。単純なカウントなら str.count() のほうが読みやすいでしょう。周囲の処理を明確にできる場合は、明示的な反復を選んでください。
正規表現で文字を数える
対象がパターンである場合や、タスクですでに正規表現を使っている場合は、標準ライブラリの re モジュールを使います。正規表現では、文字をそのまま指定しても文字どおりに解釈されるとは限りません。. や * のような記号には特別な意味があります。ユーザー入力を文字どおりの文字列として照合したい場合は、パターンを組み立てる前に re.escape() を適用してください。
import re
text = "hello, world!"
target = "l"
pattern = re.escape(target)
count = len(re.findall(pattern, text))
print(count)
re.findall() は一致した項目を返し、len() でその数を数えられます。正規表現は文字列の単純なカウントより柔軟ですが、パターン構文を理解する必要があります。通常の文字や部分文字列を数えるだけなら、str.count() のほうが簡単です。複数文字のパターンを照合する場合は、通常の重ならない一致方法が目的に合うか確認してください。
用途に合った方法を選ぶ
- 文字や部分文字列をそのまま指定して数える場合は
str.count()を使います。簡潔に書けて、大文字と小文字を区別し、部分文字列は重ならないものとして数えます。 - すべての文字の出現回数を集計したり、複数の文字を調べたりする場合は
collections.Counterを使います。 - 文字を調べるたびに独自の処理が必要な場合は、ループまたは
sum()とジェネレーターを使います。 - 検索対象がパターンである場合は
reを使います。ユーザー入力を文字どおりに照合するにはre.escape()でエスケープしてください。
1文字を数えるだけなら、まず str.count() を使うとよいでしょう。ほかの方法は、すべての文字の集計、文字ごとの明示的な処理、パターン照合といった別の用途に適しています。文字列検索に関する別の方法は、こちらの Python チュートリアルを参照してください。