I'm versuchen, bestimmte Zeichen aus einer Zeichenfolge mit Python zu entfernen. Dies ist der Code I'm mit jetzt. Leider scheint es nichts zu tun, um die Zeichenfolge.
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
Wie kann ich das richtig machen?
Strings in Python sind unveränderlich (können nicht geändert werden). Aus diesem Grund wird durch line.replace(...)
lediglich eine neue Zeichenkette erzeugt, anstatt die alte zu ändern. Sie müssen sie an line
neu binden (zuweisen), damit diese Variable den neuen Wert annimmt, wobei diese Zeichen entfernt werden.
Außerdem wird die Art und Weise, wie Sie es tun, relativ langsam sein. Es ist auch wahrscheinlich, dass es für erfahrene Pythonisten etwas verwirrend ist, da sie eine doppelt verschachtelte Struktur sehen und für einen Moment denken werden, dass etwas Komplizierteres vor sich geht.
Ab Python 2.6 und neueren Python 2.x Versionen * können Sie stattdessen str.translate
verwenden (aber lesen Sie weiter für die Unterschiede zu Python 3):
line = line.translate(None, '!@#$')
oder die Ersetzung regulärer Ausdrücke mit re.sub
import re
line = re.sub('[!@#$]', '', line)
Die in Klammern eingeschlossenen Zeichen bilden eine Zeichenklasse. Alle Zeichen in line
, die zu dieser Klasse gehören, werden durch den zweiten Parameter von sub
ersetzt: eine leere Zeichenkette.
In Python 3 sind Zeichenketten Unicode. Sie müssen ein wenig anders übersetzen. kevpie erwähnt dies in einem Kommentar zu einer der Antworten, und es ist in der Dokumentation für str.translate
vermerkt.
Wenn Sie die Methode translate
eines Unicode-Strings aufrufen, können Sie den zweiten Parameter, den wir oben verwendet haben, nicht übergeben. Sie können auch nicht None
als ersten Parameter übergeben, oder gar eine Übersetzungstabelle von string.maketrans
. Stattdessen übergeben Sie ein Wörterbuch als einzigen Parameter. Dieses Wörterbuch ordnet die Ordinalwerte der Zeichen (d.h. das Ergebnis des Aufrufs von ord
für sie) den Ordinalwerten der Zeichen zu, die sie ersetzen sollen, oder - für uns nützlich - None
, um anzuzeigen, dass sie gelöscht werden sollen.
Um den obigen Tanz mit einer Unicode-Zeichenkette zu vollführen, würden Sie also etwas aufrufen wie
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
Hier werden dict.fromkeys
und map
verwendet, um kurz und bündig ein Wörterbuch zu erzeugen, das
{ord('!'): None, ord('@'): None, ...}
Noch einfacher ist es, wie eine andere Antwort es ausdrückt, das Wörterbuch an Ort und Stelle zu erstellen:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
* Für die Kompatibilität mit früheren Pythons können Sie eine "null" Übersetzungstabelle erstellen, die anstelle von None
übergeben wird:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
Hier wird string.maketrans
verwendet, um eine Übersetzungstabelle zu erstellen, die nur eine Zeichenkette ist, die die Zeichen mit den Ordnungswerten 0 bis 255 enthält.
line = line.translate(None, " ?.!/;:")
Zeichenketten sind in Python unveränderlich. Die Methode replace
gibt nach der Ersetzung eine neue Zeichenkette zurück. Versuchen Sie es:
for char in line:
if char in " ?.!/;:":
line = line.replace(char,'')