Zeichenfolgen in Python sind unveränderlich (können nicht geändert werden). Aus diesem Grund line.replace(...)
wird nur eine neue Zeichenfolge erstellt, anstatt die alte zu ändern. Sie müssen es erneut binden (zuweisen) line
, damit diese Variable den neuen Wert annimmt und diese Zeichen entfernt werden.
Außerdem wird die Art und Weise, wie Sie es tun, relativ langsam sein. Es ist wahrscheinlich auch etwas verwirrend für erfahrene Pythonatoren, die eine doppelt verschachtelte Struktur sehen und für einen Moment denken, dass etwas Komplizierteres vor sich geht.
Ab Python 2.6 und neueren Python 2.x-Versionen * können Sie stattdessen Folgendes verwenden str.translate
(lesen Sie jedoch weiter für Python 3-Unterschiede):
line = line.translate(None, '!@#$')
oder Ersatz für reguläre Ausdrücke durch re.sub
import re
line = re.sub('[!@#$]', '', line)
Die in Klammern eingeschlossenen Zeichen bilden eine Zeichenklasse . Alle Zeichen in line
dieser Klasse werden durch den zweiten Parameter ersetzt sub
: eine leere Zeichenfolge.
In Python 3 sind Zeichenfolgen Unicode. Sie müssen etwas anders übersetzen. kevpie erwähnt dies in einem Kommentar zu einer der Antworten und ist in der Dokumentation fürstr.translate
vermerkt .
Wenn Sie die translate
Methode einer Unicode-Zeichenfolge aufrufen , können Sie den oben verwendeten zweiten Parameter nicht übergeben. Sie können auch nicht None
als ersten Parameter übergeben. Stattdessen übergeben Sie eine Übersetzungstabelle (normalerweise ein Wörterbuch) als einzigen Parameter. Diese Tabelle bildet die Ordnungswerte von Zeichen ab (dh das Ergebnis des Aufrufsord
) den Ordnungswerten der Zeichen zu, die sie ersetzen sollen, oder - für uns nützlich - um anzuzeigen None
, dass sie gelöscht werden sollen.
Um den obigen Tanz mit einer Unicode-Saite zu machen, würde man so etwas nennen
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
Hier dict.fromkeys
und map
werden verwendet, um kurz und bündig ein Wörterbuch zu generieren, das enthält
{ord('!'): None, ord('@'): None, ...}
Noch einfacher, wie eine andere Antwort sagt , erstellen Sie die Übersetzungstabelle an Ort und Stelle:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
Oder erstellen Sie dieselbe Übersetzungstabelle mit str.maketrans
:
unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))
* Aus Gründen der Kompatibilität mit früheren Pythons können Sie eine "Null" -Übersetzungstabelle erstellen, die anstelle von None
:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
Hier string.maketrans
wird eine Übersetzungstabelle erstellt , bei der es sich lediglich um eine Zeichenfolge handelt, die Zeichen mit den Ordnungswerten 0 bis 255 enthält.
filter
Funktion und einem Lambda-Ausdruck :filter(lambda ch: ch not in " ?.!/;:", line)
. Ziemlich prägnant und effizient, denke ich. Natürlich wird eine neue Zeichenfolge zurückgegeben, der Sie einen Namen zuweisen müssen.