HOWTO · Python
Sonderzeichen aus der Zeichenkette in Python entfernen
Dieses Tutorial erklärt, wie man alle Sonderzeichen aus der Zeichenkette in Python entfernt
Auf dieser Seite
Um Zeichen aus einer Python-Zeichenkette zu entfernen, legen Sie zuerst fest, welche Zeichen erhalten bleiben sollen. Eine Comprehension oder filter() mit str.isalnum() behält Unicode-Buchstaben und -Ziffern; ein regulärer Ausdruck kann Leerzeichen erhalten, während sich mit str.translate() eine bestimmte Zeichengruppe gezielt entfernen lässt. Die Beispiele verwenden "Hey! What's up bro?", damit die jeweilige Regel deutlich wird. Jedes Codebeispiel enthält eine eigene Eingabe und gibt die umgewandelte Zeichenkette aus, sodass Sie die Ansätze unabhängig voneinander ausführen können.
Festlegen, was als Sonderzeichen gilt
Für „Sonderzeichen“ gibt es keine einheitliche Regel. Gemeint sein können nur Satzzeichen, Satzzeichen und Leerzeichen oder alle Zeichen außerhalb der ASCII-Buchstaben und -Ziffern. Wählen Sie die Regel passend zum Verwendungszweck der bereinigten Zeichenkette: Ein Anzeigename darf Leerzeichen enthalten, eine kompakte Kennung möglicherweise nicht.
Python-Zeichenketten bestehen aus Unicode-Zeichen. str.isalnum() erkennt Unicode-Buchstaben und -Ziffern und kann daher Zeichen wie é und 中 beibehalten. Ein Muster mit [a-zA-Z0-9] umfasst dagegen nur ASCII-Buchstaben und -Ziffern. Die folgenden Methoden liefern deshalb unterschiedliche Ergebnisse, sofern Sie nicht dieselbe Zeichenregel zugrunde legen.
Nicht alphanumerische Zeichen mit einer Comprehension entfernen
Verwenden Sie eine String-Comprehension mit str.isalnum(), wenn das Ergebnis nur Buchstaben und Ziffern enthalten soll. str.join() fügt die beibehaltenen Zeichen zu einer neuen Zeichenkette zusammen. Nach dieser Regel werden auch Leerzeichen und Satzzeichen entfernt.
original = "Hey! What's up bro?"
cleaned = "".join(char for char in original if char.isalnum())
print(cleaned)
HeyWhatsupbro
Das Prädikat behält Unicode-Buchstaben und -Ziffern ebenso wie ASCII-Zeichen bei. Ein Buchstabe wie é bleibt beispielsweise erhalten; Leerzeichen, Apostrophe und Satzzeichen werden ausgelassen.
Zeichen mit filter() filtern
Die eingebaute Funktion filter() wendet ein Prädikat auf jedes Zeichen an und liefert einen Iterator mit den Zeichen zurück, für die das Prädikat wahr ist. Mit str.isalnum bleiben dieselben Unicode-Buchstaben und -Ziffern wie bei der Comprehension erhalten; str.join() wandelt den Iterator wieder in eine Zeichenkette um. Wie bei der Comprehension werden Leerzeichen entfernt.
original = "Hey! What's up bro?"
kept = filter(str.isalnum, original)
cleaned = "".join(kept)
print(cleaned)
HeyWhatsupbro
Verwenden Sie filter(), wenn Sie ein Prädikat wiederverwenden möchten oder bereits eines definiert haben. Für diese einfache Umwandlung einer Zeichenkette drückt die Comprehension dieselbe Regel kompakter aus.
Eine festgelegte Zeichengruppe mit str.translate() entfernen
Verwenden Sie str.translate(), wenn Sie die zu entfernenden Zeichen kennen und alle übrigen Zeichen erhalten bleiben sollen. str.maketrans() erstellt eine Tabelle, die jedes ausgewählte Zeichen der Entfernung zuordnet. Die folgende Auswahl entfernt gängige ASCII-Satzzeichen; Leerzeichen und alle nicht aufgeführten Zeichen bleiben unverändert.
original = "Hey! What's up bro?"
characters_to_remove = "!@#$%^&*()_-+=<>,./?;:'\"[]{}\\|`~"
table = str.maketrans("", "", characters_to_remove)
cleaned = original.translate(table)
print(cleaned)
Hey Whats up bro
Passen Sie characters_to_remove an Ihre Eingabe an, indem Sie Zeichen hinzufügen oder daraus entfernen. Diese Methode entfernt nicht alle Zeichen, die als Satzzeichen gelten könnten: Ein nicht aufgeführtes Zeichen, auch ein Satzzeichen außerhalb von ASCII, bleibt im Ergebnis erhalten.
Zeichen mit einem regulären Ausdruck entfernen
Verwenden Sie re.sub(), um jedes Zeichen zu ersetzen, auf das ein Muster zutrifft. Dieses Muster lässt nur ASCII-Buchstaben und -Ziffern stehen und entfernt daher sowohl Leerzeichen als auch Satzzeichen. Die Abbildung zum Artikel veranschaulicht dieselbe Regel. Die Buchstaben- und Ziffernbereiche sind auf ASCII beschränkt; verwenden Sie eine Unicode-kompatible Regel, wenn der Text Buchstaben außerhalb dieser Bereiche enthält.
import re
original = "Hey! What's up bro?"
pattern = r"[^a-zA-Z0-9]"
cleaned = re.sub(pattern, "", original)
print(cleaned)
HeyWhatsupbro
Die bereitgestellten Laufzeitnachweise belegen, dass dieses Beispiel die oben gezeigte Ausgabe erzeugt. Um Leerzeichen beizubehalten, ergänzen Sie \s wie in r"[^a-zA-Z0-9\s]" um die erlaubte Zeichengruppe. Mit den Zeichenklassen und Flags regulärer Ausdrücke in Python lassen sich auch andere Regeln ausdrücken. Prüfen Sie jedoch, ob das gewählte Muster zur Sprache und zu den Zeichen Ihrer Daten passt.
Zeichen mit map() und einer Lambda-Funktion umwandeln
map() wendet eine Funktion auf jedes Zeichen an und gibt einen Iterator zurück. Eine Lambda-Funktion kann das ursprüngliche Zeichen zurückgeben, wenn es ein Unicode-Buchstabe, eine Unicode-Ziffer oder ein Leerraumzeichen ist, und für andere Zeichen eine leere Zeichenkette liefern. Durch das Zusammenfügen dieser Ergebnisse entsteht die bereinigte Zeichenkette. Nach dieser Regel bleiben Leerraumzeichen einschließlich Tabulatoren und Zeilenumbrüchen erhalten.
original = "Hey! What's up bro?"
cleaned = "".join(
map(lambda char: char if char.isalnum() or char.isspace() else "", original)
)
print(cleaned)
Hey Whats up bro
Dies ist eine zeichenweise Alternative, wenn die Umwandlung mehr Logik erfordert als ein einfaches Auswahlprädikat. Sollen nur Buchstaben und Ziffern erhalten bleiben, verwenden Sie stattdessen das Beispiel mit der Comprehension oder filter().
Die Methode passend zu Ihren Zeichenregeln auswählen
- Wählen Sie eine Comprehension mit
str.isalnum()für eine direkte, gut lesbare Regel, die Unicode-Buchstaben und -Ziffern behält und Leerzeichen entfernt. - Wählen Sie
filter(), wenn Sie ein wiederverwendbares Prädikat übergeben möchten; im Beispiel gilt dieselbe Regel mitstr.isalnum(). - Wählen Sie
str.translate(), um eine bekannte Zeichengruppe zu entfernen und alle übrigen Zeichen einschließlich Leerzeichen und nicht aufgeführter Satzzeichen beizubehalten. - Wählen Sie
re.sub(), wenn ein Muster beschreibt, welche Zeichen entfernt oder beibehalten werden sollen. Die gezeigten ASCII-Bereiche entfernen Leerzeichen; passen Sie das Muster für Unicode-Text oder zum Beibehalten von Leerzeichen an. - Wählen Sie
map()mit einer Lambda-Funktion für eine zeichenweise Umwandlungslogik. Das Beispiel behält Unicode-Buchstaben, -Ziffern und Leerraumzeichen bei.
Legen Sie bei Namen und natürlichsprachlichem Text vor der Bereinigung fest, wie Akzente, nichtlateinische Schriften und Abstände behandelt werden sollen. Bei Kennungen oder Eingaben für ein bestimmtes Protokoll sollten Sie sich exakt an den dokumentierten Zeichensatz halten, statt sich auf eine allgemeine Vorstellung von „Sonderzeichen“ zu verlassen.