Ich muss alle Sonderzeichen, Satzzeichen und Leerzeichen aus einer Zeichenfolge entfernen, damit ich nur Buchstaben und Zahlen habe.
236
Dies kann ohne Regex erfolgen:
>>> string = "Special $#! characters spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'
Sie können verwenden str.isalnum
:
S.isalnum() -> bool Return True if all characters in S are alphanumeric and there is at least one character in S, False otherwise.
Wenn Sie auf der Verwendung von Regex bestehen, sind andere Lösungen ausreichend. Beachten Sie jedoch, dass dies der beste Weg ist, wenn dies ohne Verwendung eines regulären Ausdrucks möglich ist.
isalnum()
als auch die Regex-Version verglichen und die Regex-Version ist 50-75% schnellerHier ist eine Regex, die einer Zeichenfolge entspricht, die keine Buchstaben oder Zahlen sind:
Hier ist der Python-Befehl, um eine Regex-Ersetzung durchzuführen:
quelle
+
Quantifizierer hinzufügen , um seine Effizienz ein wenig zu verbessern.)[^A-Za-z0-9 ]+
Kürzere Art:
Wenn Sie Leerzeichen zwischen Wörtern und Zahlen wünschen, ersetzen Sie '' durch ''
quelle
r'\W+'
- etwas vom Thema abweichen (und sehr pedantisch), aber ich schlage vor, dass alle Regex-Muster rohe Zeichenfolgen sindNachdem ich dies gesehen hatte, war ich daran interessiert, die bereitgestellten Antworten zu erweitern, indem ich herausfand, welche in kürzester Zeit ausgeführt werden. Daher ging ich einige der vorgeschlagenen Antworten durch und verglich sie mit
timeit
zwei der Beispielzeichenfolgen:string1 = 'Special $#! characters spaces 888323'
string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'
Beispiel 1
'.join(e for e in string if e.isalnum())
string1
- Ergebnis: 10.7061979771string2
- Ergebnis: 7.78372597694Beispiel 2
import re re.sub('[^A-Za-z0-9]+', '', string)
string1
- Ergebnis: 7.10785102844string2
- Ergebnis: 4.12814903259Beispiel 3
import re re.sub('\W+','', string)
string1
- Ergebnis: 3.11899876595string2
- Ergebnis: 2.78014397621Die obigen Ergebnisse sind ein Produkt des niedrigsten zurückgegebenen Ergebnisses aus einem Durchschnitt von:
repeat(3, 2000000)
Beispiel 3 kann 3x schneller sein als Beispiel 1 .
quelle
''.join([*filter(str.isalnum, string)])
Python 2. *
Ich denke
filter(str.isalnum, string)
funktioniert einfachPython 3. *
In Python3
filter( )
würde die Funktion ein itertable-Objekt zurückgeben (anstelle einer Zeichenfolge wie oben). Man muss sich wieder verbinden, um eine Zeichenfolge aus itertable zu erhalten:oder
list
Join-Verwendung zu übergeben ( nicht sicher, kann aber ein bisschen schnell sein )Hinweis: Auspacken
[*args]
gültig von Python> = 3.5quelle
map
,filter
undreduce
kehrt itertable Objekt statt. Noch in Python3 + werde ich die akzeptierte Antwort vorziehen''.join(filter(str.isalnum, string))
(oder die Liste im Join-Gebrauch übergeben''.join([*filter(str.isalnum, string)])
).''.join(filter(str.isalnum, string))
es eine Verbesserung istfilter(str.isalnum, string)
, zumindest zu lesen. Ist das wirklich die pythreenische (ja, das können Sie verwenden) Methode, um dies zu tun?filter(str.isalnum, string)
nicht zurück Zeichenfolge in Python3 wiefilter( )
in Python3 Iterator zurückgibt , anstatt Argumenttyp im Gegensatz zu Python-2 +.Sie können weitere Sonderzeichen hinzufügen, die durch '' ersetzt werden. Dies bedeutet nichts, dh sie werden entfernt.
quelle
Anders als alle anderen, die Regex verwenden, würde ich versuchen, jedes Zeichen auszuschließen, das nicht das ist, was ich will, anstatt explizit aufzuzählen, was ich nicht will.
Wenn ich zum Beispiel nur Zeichen von 'a bis z' (Groß- und Kleinbuchstaben) und Zahlen möchte, würde ich alles andere ausschließen:
Dies bedeutet "Ersetzen Sie jedes Zeichen, das keine Zahl ist, oder ein Zeichen im Bereich 'a bis z' oder 'A bis Z' durch eine leere Zeichenfolge".
Wenn Sie das Sonderzeichen
^
an der ersten Stelle Ihrer Regex einfügen , erhalten Sie die Negation.Zusätzlicher Tipp: Wenn Sie das Ergebnis auch in Kleinbuchstaben schreiben müssen , können Sie den regulären Ausdruck noch schneller und einfacher machen, solange Sie jetzt keine Großbuchstaben finden.
quelle
Angenommen, Sie möchten einen regulären Ausdruck verwenden und möchten / benötigen einen Unicode-erkennenden 2.x-Code, der 2to3-fähig ist:
quelle
quelle
Der allgemeinste Ansatz ist die Verwendung der 'Kategorien' der Unicodedata-Tabelle, die jedes einzelne Zeichen klassifiziert. Der folgende Code filtert beispielsweise nur druckbare Zeichen basierend auf ihrer Kategorie:
Schauen Sie sich die oben angegebene URL für alle verwandten Kategorien an. Sie können natürlich auch nach den Interpunktionskategorien filtern.
quelle
$
am Ende jeder Zeile?string.punctuation enthält folgende Zeichen:
Sie können die Funktionen translate und maketrans verwenden, um Interpunktionen leeren Werten zuzuordnen (ersetzen).
Ausgabe:
quelle
Einen Übersetzer benutzen:
Vorsichtsmaßnahme: Funktioniert nur bei ASCII-Saiten.
quelle
TypeError: translate() takes exactly one argument (2 given)
mit py3.4das gleiche wie doppelte Anführungszeichen. "" "
quelle
und du wirst dein Ergebnis sehen als
'askhnlaskdjalsdk
quelle
re
aber nie verwendet. Ihrereplace
Kriterien funktionieren nur für diese bestimmte Zeichenfolge. Was ist, wenn Ihre Zeichenfolge istabc = "askhnl#$%!askdjalsdk"
? Ich denke nicht, dass etwas anderes als das#$%
Muster funktionieren wird.Interpunktionen, Zahlen und Sonderzeichen entfernen
Beispiel: -
Code
Ergebnis:-
Vielen Dank :)
quelle