HOWTO · Python
在 Python 中計算字串中字元的出現次數
了解如何使用 `str.count()` 計算 Python 字串中的字元,並進一步認識以 `Counter`、迴圈或正規表示式處理不同計數需求的方法。
本頁內容
使用 str.count() 計算 Python 字串中特定字元的次數。此方法會區分大小寫,也能計算子字串,但不會計入彼此重疊的比對結果。若要統計每個字元的頻率,可使用 collections.Counter;需要自訂處理方式時可使用迴圈;需要比對模式時則可使用正規表示式。
使用 str.count() 計算單一字元
內建字串方法 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 可以從可疊代物件(包括字串)建立頻率表。若需要統計多個字元,而不只是其中一個,這個方法就很實用。使用方括號即可查詢特定字元的次數;若輸入中沒有該字元,結果會是 0。
from collections import Counter
text = "hello, world!"
counts = Counter(text)
print(counts["l"])
print(counts)
第一次查詢會回答單一字元的計數問題,而 Counter 物件則包含整個字串中各字元的次數。你可以使用 counts.most_common() 查看最常見的項目。此方法只使用 Python 標準函式庫,不需要 NumPy 或其他第三方套件。
使用迴圈或推導式計數
明確的迴圈會將比較與遞增計數的步驟清楚呈現;若計數時還需要套用其他條件或自訂處理,這種寫法就很實用。若目標是計算個別字元,請將目標設為只含一個字元的字串。
text = "hello, world!"
target = "l"
count = 0
for character in text:
if character == target:
count += 1
print(count)
另一種精簡寫法是搭配產生器運算式使用 sum()。它會為每個符合條件的字元加一,而且不需要建立中間清單:
text = "hello, world!"
target = "l"
count = sum(character == target for character in text)
print(count)
對於單一字元目標,迴圈和產生器會像 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()跳脫。
大多數單一字元計數問題都可以先從 str.count() 開始。其他方法則適用於不同需求:統計所有字元、逐一處理字元,或比對模式。若想了解其他字串搜尋技巧,請參閱這篇 Python 教學。