文字列

【Python】文字列中の部分文字列の出現回数をカウントする方法

【Python】文字列中の部分文字列の出現回数をカウントする方法

Pythonで文字列中の部分文字列の出現回数をカウントする方法について解説します。

部分文字列の出現回数をカウントする

Pythonで対象としている文字列内に含まれる部分文字列の出現回数をカウントしたい場合があります。このような場合にはstrクラスのcountメソッドを使用する場合と正規表現モジュールreを使用する方法があります。

本記事では、部分文字列の出現回数をカウントする方法について例を使って説明します。

countメソッドを使用する場合

文字列内に含まれる部分文字列の出現回数をカウントする方法としてstrクラスのcountメソッドが使用できます。

基本的な使い方

countメソッドを使用する場合には、以下のようにして部分文字列の出現回数をカウントします。

text = "PythonPythonPythonプロジェクトPythonプロジェクトPython"

# countで部分文字列をカウントする
print(text.count("Python"))

# countは重複のない出現回数をカウントするので注意
print(text.count("PythonPython"))
【実行結果】
5
1

上記の1つ目のカウント例では、文字列に”Python”という部分文字列が何回出現するかを確認しています。結果は5ということで部分文字列の出現回数を調べることができています。

countメソッドでの注意点としては、重複のない出現回数をカウントするという点です。

2つ目のカウント例で”PythonPython”という部分文字列をカウントしていますが、結果は1となっています。この場合は以下の画像に示すように、最初の文字列がヒットした後は、次の検索開始位置はヒットした部分文字列の次の位置からになります。

部分文字列の検索(重複のない出現回数)

上記例では、最初の”PythonPythonPython”の中に、”PythonPython”という部分文字列が2つあるというように考えることもできますが、countメソッドは重複を許してカウントできません。このようにカウントしたい場合は、後述する正規表現reモジュールを使った対応ができます。

大文字・小文字を区別しないでカウントする方法

対象文字列内で大文字・小文字を区別しないでカウントしたい場合は、以下のようにします。

text = "PythonPythonPythonプロジェクトPythonプロジェクトPython"

# 大文字・小文字を区別しないでカウントする
print(text.lower().count("python"))
print(text.upper().count("PYTHON"))
【実行結果】
5
5

上記例では、対象文字列であるtextに対してlowerメソッドやupperメソッドを適用して小文字や大文字に統一しています。このように統一することで大文字・小文字を区別しないようなカウントをすることが可能です。

なお、文字列の大文字・小文字に関する変換方法は「文字列の大文字と小文字を変換する方法」でまとめていますので興味があれば参考にしてください。

正規表現モジュールreを使用する場合

正規表現モジュールreを使用して部分文字列の出現回数をカウントする方法を説明します。reモジュールの使い方は「正規表現モジュール re の基本的な使い方」でまとめていますので各メソッドの説明は省略します。必要に応じて上記ページを参照してください。

countとは違って正規表現で表現できるものにマッチするものをカウントすることができるためより柔軟性があります。

findallを使った方法

reモジュールのfindallを使用することで、以下のように部分文字列の出現回数をカウントすることができます。

import re

text = "PythonPythonPythonプロジェクトPythonプロジェクトPython"

# reを使って部分文字列をカウントする
ptrn = re.compile("Python")
result = ptrn.findall(text)
print(len(result))

# 重複のない出現回数をカウントするので注意
ptrn = re.compile("PythonPython")
result = ptrn.findall(text)
print(len(result))
【実行結果】
5
1

上記例ではreモジュールのfindallで対象文字列を抽出しています。resultに入るのは抽出した文字列のリストになります。今回は出現回数を求めたいのでlen(result)とすることで部分文字列の出現回数をカウントすることができます。

なお、上記はcountの例と揃えるために単純な文字列を指定していますが、任意の正規表現を指定して任意パターンに一致する部分文字列の出現回数を求めることももちろん可能です。

大文字・小文字を区別しないでカウントする方法

対象文字列内で大文字・小文字を区別しないでカウントしたい場合は、以下のようにre.IGNORECASEを指定します。

import re

text = "PythonPythonPythonプロジェクトPythonプロジェクトPython"

# 大文字・小文字を区別しないでカウントする
ptrn = re.compile("python", re.IGNORECASE)
result = ptrn.findall(text)
print(len(result))

ptrn = re.compile("PYTHON", re.IGNORECASE)
result = ptrn.findall(text)
print(len(result))
【実行結果】
5
5

上記のようにcompileの引数としてre.IGNORECASEを指定することで簡単に大文字・小文字を区別しないでカウントすることが可能です。

重複を許してカウントする方法

これまでcountメソッドやreでのカウント方法を見てきましたが、重複を許してカウントすることができていませんでした。重複を許してカウントしたい場合には、正規表現の先読みアサーション (?=…)というものを使用することで以下のようにカウントすることも可能です。

import re

text = "PythonPythonPythonプロジェクトPythonプロジェクトPython"

# 重複を含めてカウントする方法 先読みアサーション(?=...)を使用
ptrn = re.compile(r"(?=(PythonPython))")
result = ptrn.findall(text)
print(len(result))
【実行結果】
2

上記例では、”PythonPythonPython”の中の”PythonPython”という部分文字列を2つとしてカウントできていることが分かります。

まとめ

Pythonで文字列中の部分文字列の出現回数をカウントする方法について解説しました。

方法として、strクラスのcountメソッドを使用する場合と正規表現モジュールreを使用する方法を紹介しています。

簡単な例ではstrクラスのcountメソッドで十分ですが、任意のパターンに一致する部分文字列の出現回数や重複を許してのカウントなど柔軟に対応したい場合はreモジュールの使用を考えてみてください。