Was ist der beste Weg, um mit Python alle nicht alphanumerischen Zeichen aus einer Zeichenfolge zu entfernen?
Die in der PHP-Variante dieser Frage vorgestellten Lösungen funktionieren wahrscheinlich mit einigen geringfügigen Anpassungen, scheinen mir jedoch nicht sehr "pythonisch" zu sein.
Für die Aufzeichnung möchte ich nicht nur Punkte und Kommas (und andere Satzzeichen) entfernen, sondern auch Anführungszeichen, Klammern usw.
Antworten:
Ich habe gerade einige Funktionen aus Neugier zeitlich festgelegt. In diesen Tests entferne ich nicht alphanumerische Zeichen aus der Zeichenfolge
string.printable
(Teil des integriertenstring
Moduls). Die Verwendung von kompiliert'[\W_]+'
undpattern.sub('', str)
wurde als am schnellsten befunden.quelle
valid_characters = string.ascii_letters + string.digits
gefolgt vonjoin(ch for ch in string.printable if ch in valid_characters)
und es war 6 Mikrosekunden schneller als dieisalnum()
Option. Immer noch viel langsamer als der reguläre Ausdruck.pattern.sub('', string.printable)
stattdessen - dumm, re.sub aufzurufen, wenn Sie ein RE-Objekt haben! -).re.compile('[\W_]+', re.UNICODE)
Sie diese Option, um die Unicode-Sicherheit zu gewährleisten.Regelmäßige Ausdrücke zur Rettung:
quelle
\W
behält aber auch die Unterstriche bei.Verwenden Sie die Methode str.translate () .
Vorausgesetzt, Sie tun dies häufig:
(1) Erstellen Sie einmal eine Zeichenfolge mit allen Zeichen, die Sie löschen möchten:
(2) Wann immer Sie eine Zeichenfolge zerquetschen möchten:
Die Einrichtungskosten sind wahrscheinlich im Vergleich zu re.compile günstig. Die Grenzkosten sind viel niedriger:
Hinweis: Die Verwendung von string.printable als Benchmark-Daten verschafft dem Muster '[\ W _] +' einen unfairen Vorteil . Alle nicht alphanumerischen Zeichen befinden sich in einem Bündel. In typischen Daten wäre mehr als eine Ersetzung erforderlich:
Folgendes passiert, wenn Sie re.sub etwas mehr Arbeit geben:
quelle
string.punctuation
anstelle von''.join(c for c in map(chr, range(256)) if not c.isalnum())
str
Objekte funktioniert , jedoch nicht fürunicode
Objekte..join()
?Du könntest es versuchen:
quelle
quelle
Wie wäre es mit:
Dies funktioniert mithilfe des Listenverständnisses, um eine Liste der Zeichen zu erstellen, in denen
InputString
sie in der Kombinationascii_letters
und dendigits
Zeichenfolgen vorhanden sind. Anschließend wird die Liste zu einer Zeichenfolge zusammengefügt.quelle
Als Nebeneffekt einiger anderer Antworten biete ich eine wirklich einfache und flexible Möglichkeit, eine Reihe von Zeichen zu definieren, auf die Sie den Inhalt einer Zeichenfolge beschränken möchten. In diesem Fall erlaube ich alphanumerische Zeichen und Unterstriche. Fügen Sie einfach Zeichen zu meinem hinzu oder entfernen
PERMITTED_CHARS
Sie sie, je nach Anwendungsfall.quelle
string.digits + string.ascii_letters + '_-'
.SPECIAL_CHARS = '_-'
und dann verwendenstring.digits + string.ascii_letters + SPECIAL_CHARS
quelle
e for e in sent
und prüft via-if e.isalpha()
Anweisung, ob das aktuelle Zeichen ein alphabetisches Symbol ist. Wenn ja, verbindet es mit dersent
Variablen viasent = "".join()
und alle nicht-alphabetischen Symbole werden durch""
(leere Zeichenfolge) ersetzt, weil derjoin
Funktion.quelle
Timing mit zufälligen Zeichenfolgen von ASCII-Ausdrucken:
Ergebnis (Python 3.7):
str.maketrans
&str.translate
ist am schnellsten, enthält jedoch alle Nicht-ASCII-Zeichen.re.compile
&pattern.sub
ist langsamer, aber irgendwie schneller als''.join
&filter
.quelle
Wenn ich richtig verstanden habe, ist es am einfachsten, reguläre Ausdrücke zu verwenden, da dies Ihnen viel Flexibilität bietet. Die andere einfache Methode, die für die Schleifenverfolgung verwendet wird, ist der Code mit Beispiel. Ich habe auch das Auftreten von Wörtern gezählt und im Wörterbuch gespeichert.
Bitte bewerten Sie dies, wenn diese Antwort nützlich ist!
quelle