Ich muss alle Sonderzeichen, Satzzeichen und Leerzeichen aus einer Zeichenfolge entfernen, damit ich nur Buchstaben und Zahlen habe.
Ich muss alle Sonderzeichen, Satzzeichen und Leerzeichen aus einer Zeichenfolge entfernen, damit ich nur Buchstaben und Zahlen habe.
Antworten:
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% schneller
Hier ist eine Regex, die einer Zeichenfolge entspricht, die keine Buchstaben oder Zahlen sind:
[^A-Za-z0-9]+
Hier ist der Python-Befehl, um eine Regex-Ersetzung durchzuführen:
re.sub('[^A-Za-z0-9]+', '', mystring)
+
Quantifizierer hinzufügen , um seine Effizienz ein wenig zu verbessern.)
[^A-Za-z0-9 ]+
Kürzere Art:
import re
cleanString = re.sub('\W+','', string )
Wenn Sie Leerzeichen zwischen Wörtern und Zahlen wünschen, ersetzen Sie '' durch ''
r'\W+'
- etwas vom Thema abweichen (und sehr pedantisch), aber ich schlage vor, dass alle Regex-Muster rohe Zeichenfolgen sind
Nachdem 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!!!'
'.join(e for e in string if e.isalnum())
string1
- Ergebnis: 10.7061979771string2
- Ergebnis: 7.78372597694import re
re.sub('[^A-Za-z0-9]+', '', string)
string1
- Ergebnis: 7.10785102844string2
- Ergebnis: 4.12814903259import 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 .
''.join([*filter(str.isalnum, string)])
Ich denke filter(str.isalnum, string)
funktioniert einfach
In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
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:
''.join(filter(str.isalnum, string))
oder list
Join-Verwendung zu übergeben ( nicht sicher, kann aber ein bisschen schnell sein )
''.join([*filter(str.isalnum, string)])
Hinweis: Auspacken [*args]
gültig von Python> = 3.5
map
, filter
und reduce
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 ist filter(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 wie filter( )
in Python3 Iterator zurückgibt , anstatt Argumenttyp im Gegensatz zu Python-2 +.
#!/usr/bin/python
import re
strs = "how much for the maple syrup? $20.99? That's ricidulous!!!"
print strs
nstr = re.sub(r'[?|$|.|!]',r'',strs)
print nstr
nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr)
print nestr
Sie können weitere Sonderzeichen hinzufügen, die durch '' ersetzt werden. Dies bedeutet nichts, dh sie werden entfernt.
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:
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
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.
import re
s = re.sub(r"[^a-z0-9]","",s.lower())
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:
>>> import re
>>> rx = re.compile(u'[\W_]+', re.UNICODE)
>>> data = u''.join(unichr(i) for i in range(256))
>>> rx.sub(u'', data)
u'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\xaa\xb2 [snip] \xfe\xff'
>>>
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:
import unicodedata
# strip of crap characters (based on the Unicode database
# categorization:
# http://www.sql-und-xml.de/unicode-database/#kategorien
PRINTABLE = set(('Lu', 'Ll', 'Nd', 'Zs'))
def filter_non_printable(s):
result = []
ws_last = False
for c in s:
c = unicodedata.category(c) in PRINTABLE and c or u'#'
result.append(c)
return u''.join(result).replace(u'#', u' ')
Schauen Sie sich die oben angegebene URL für alle verwandten Kategorien an. Sie können natürlich auch nach den Interpunktionskategorien filtern.
$
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).
import string
'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))
Ausgabe:
'This is A test'
Einen Übersetzer benutzen:
import string
def clean(instr):
return instr.translate(None, string.punctuation + ' ')
Vorsichtsmaßnahme: Funktioniert nur bei ASCII-Saiten.
TypeError: translate() takes exactly one argument (2 given)
mit py3.4
import re
my_string = """Strings are amongst the most popular data types in Python. We can create the strings by enclosing characters in quotes. Python treats single quotes the
das gleiche wie doppelte Anführungszeichen. "" "
# if we need to count the word python that ends with or without ',' or '.' at end
count = 0
for i in text:
if i.endswith("."):
text[count] = re.sub("^([a-z]+)(.)?$", r"\1", i)
count += 1
print("The count of Python : ", text.count("python"))
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)
und du wirst dein Ergebnis sehen als
'askhnlaskdjalsdk
re
aber nie verwendet. Ihre replace
Kriterien funktionieren nur für diese bestimmte Zeichenfolge. Was ist, wenn Ihre Zeichenfolge ist abc = "askhnl#$%!askdjalsdk"
? Ich denke nicht, dass etwas anderes als das #$%
Muster funktionieren wird.
Interpunktionen, Zahlen und Sonderzeichen entfernen
Beispiel: -
Code
combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ")
Vielen Dank :)