HOWTO · Python

Vorkommen eines Zeichens in einem Python-String zählen

Dieser Artikel erklärt, wie du ein Zeichen in einem Python-String zählst, und nennt `str.count()` sowie Alternativen wie `Counter`, Schleifen und reguläre Ausdrücke.

Auf dieser Seite

Mit str.count() lässt sich zählen, wie oft ein Zeichen in einem Python-String vorkommt. Die Methode unterscheidet Groß- und Kleinschreibung und akzeptiert auch Teilstrings; überlappende Treffer werden dabei nicht gezählt. collections.Counter eignet sich, wenn die Häufigkeit jedes Zeichens benötigt wird, eine Schleife für eigene Verarbeitungsschritte und ein regulärer Ausdruck für Mustersuchen.

Ein Zeichen mit str.count() zählen

Die eingebaute String-Methode str.count() ist die einfachste Wahl für ein einzelnes wörtliches Zeichen oder einen Teilstring. Sie erhält den gesuchten Text und gibt die Anzahl der nicht überlappenden Treffer zurück. Groß- und Kleinschreibung werden unterschieden: Die Zählungen für "p" und "P" sind also getrennt.

Das eigenständige Beispiel zählt das kleingeschriebene l in einem kurzen String. Ersetze text und target durch deine eigenen Werte. Bei einem mehrstelligen Suchtext zählt dieselbe Methode nicht überlappende Teilstring-Treffer.

text = "hello, world!"
target = "l"

count = text.count(target)
print(count)

Zum Beispiel ergibt "aaaa".count("aa") den Wert 2, weil die Treffer nicht überlappen. Wenn überlappende Teilstring-Treffer gezählt werden sollen, eignet sich ein musterbasierter Ansatz. Lege dabei ausdrücklich fest, welches Trefferverhalten gewünscht ist.

Jedes Zeichen mit collections.Counter zählen

collections.Counter aus dem Python-Modul collections erstellt aus einem Iterable, beispielsweise einem String, eine Häufigkeitstabelle. Das ist nützlich, wenn die Häufigkeit mehrerer Zeichen statt nur eines einzelnen benötigt wird. Die Anzahl eines bestimmten Zeichens lässt sich über den Zugriff mit eckigen Klammern abrufen; kommt das Zeichen im Eingabetext nicht vor, ist sein Zählwert 0.

from collections import Counter

text = "hello, world!"
counts = Counter(text)

print(counts["l"])
print(counts)

Der erste Zugriff beantwortet die Frage nach einem einzelnen Zeichen; das Counter-Objekt enthält zugleich die Zählwerte für den gesamten String. Häufige Einträge lassen sich mit counts.most_common() anzeigen. Dieser Ansatz verwendet nur die Python-Standardbibliothek und benötigt daher weder NumPy noch ein anderes Paket eines Drittanbieters.

Mit einer Schleife oder einem Generatorausdruck zählen

Eine ausdrückliche Schleife macht den Vergleich und das Erhöhen des Zählers sichtbar. Das ist hilfreich, wenn beim Zählen zusätzliche Bedingungen oder eigene Verarbeitungsschritte nötig sind. Soll jedes einzelne Zeichen gezählt werden, muss target ein String mit genau einem Zeichen sein.

text = "hello, world!"
target = "l"
count = 0

for character in text:
    if character == target:
        count += 1

print(count)

Eine kompakte Alternative kombiniert sum() mit einem Generatorausdruck. Für jedes passende Zeichen wird eins addiert; eine zusätzliche Liste muss dafür nicht erstellt werden:

text = "hello, world!"
target = "l"

count = sum(character == target for character in text)
print(count)

Die Schleife und der Generator vergleichen Zeichen genauso wie str.count() bei einem einzelnen Zielzeichen; auch hier wird zwischen Groß- und Kleinschreibung unterschieden. Für eine einfache Zählung ist str.count() meist leichter zu lesen. Eine ausdrückliche Iteration ist sinnvoll, wenn dadurch die umgebende Logik verständlicher wird.

Ein Zeichen mit einem regulären Ausdruck zählen

Verwende das Standardbibliotheksmodul re, wenn das Suchziel ein Muster ist oder reguläre Ausdrücke ohnehin zur Aufgabe gehören. Ein einzelnes Zeichen wird dabei nicht immer wörtlich interpretiert: Symbole wie . und * haben eine besondere Bedeutung. Stammt das Suchziel aus einer Benutzereingabe und soll als wörtlicher Text gesucht werden, übergib es mit re.escape(), bevor du das Muster zusammensetzt.

import re

text = "hello, world!"
target = "l"
pattern = re.escape(target)
count = len(re.findall(pattern, text))
print(count)

re.findall() gibt die Treffer zurück, und len() zählt sie. Reguläre Ausdrücke sind flexibler als eine wörtliche String-Suche, bringen aber zusätzliche Mustersyntax mit sich. Für ein einfaches Zeichen oder einen Teilstring ist str.count() unkomplizierter. Bei einem mehrstelligen Muster solltest du prüfen, ob dessen übliches Verhalten mit nicht überlappenden Treffern zu deiner Aufgabe passt.

Die passende Methode auswählen

  • Verwende str.count() für ein einzelnes wörtliches Zeichen oder einen Teilstring. Die Methode ist kompakt, unterscheidet Groß- und Kleinschreibung und zählt Teilstring-Treffer ohne Überlappung.
  • Verwende collections.Counter, wenn du eine Häufigkeitstabelle für alle Zeichen oder mehrere Zählabfragen benötigst.
  • Verwende eine Schleife oder einen Generator mit sum(), wenn jedes Zeichen beim Durchlaufen individuell verarbeitet werden soll.
  • Verwende re, wenn die Suche tatsächlich einem Muster folgt; maskiere wörtliche Texte aus Benutzereingaben mit re.escape().

Bei den meisten Fragen zur Häufigkeit eines einzelnen Zeichens ist str.count() ein guter Ausgangspunkt. Die Alternativen decken andere Anforderungen ab: Statistiken zu allen Zeichen, eine ausdrückliche Verarbeitung jedes Zeichens oder eine Mustersuche. Weitere Techniken zur Suche in Strings findest du in diesem Python-Tutorial.