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 教學。