Ersetzen Sie alle nicht alphanumerischen Zeichen in einer Zeichenfolge

99

Ich habe eine Zeichenfolge, durch die ich jedes Zeichen, das kein Standardzeichen oder keine Standardzahl ist, wie z. B. (az oder 0-9), durch ein Sternchen ersetzen möchte. Zum Beispiel wird "h ^ & ell`., | Ow] {+ orld" durch "h * ell * o * w * orld" ersetzt. Beachten Sie, dass mehrere Zeichen wie "^ &" durch ein Sternchen ersetzt werden. Wie würde ich das machen?

Tschadwik
quelle

Antworten:

182

Regex zur Rettung!

import re

s = re.sub('[^0-9a-zA-Z]+', '*', s)

Beispiel:

>>> re.sub('[^0-9a-zA-Z]+', '*', 'h^&ell`.,|o w]{+orld')
'h*ell*o*w*orld'
nneonneo
quelle
7
Wenn Sie häufig mit Unicode umgehen, müssen Sie möglicherweise auch alle Nicht-ASCII-Unicode-Symbole re.sub("[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+", " ", ":%# unicode ΣΘΙП@./\n")
beibehalten
Wenn Sie Leerzeichen in Ihrer Zeichenfolge behalten möchten, fügen Sie einfach ein Leerzeichen in den Klammern hinzu: s = re ('[^ 0-9a-zA-Z] +', '*', s)
stackPusher
2
Wenn Sie mehr als einen Austausch durchführen, wird dies etwas schneller ausgeführt, wenn Sie den regulären Ausdruck vorkompilieren, z. B.import re; regex = re.compile('[^0-9a-zA-Z]+'); regex.sub('*', 'h^&ell.,|o w]{+orld')
Chris
Hinweis \Wist auch für Nicht-Wort-Zeichen, es ist fast das gleiche, erlaubt aber den Unterstrich als Wort-Zeichen (weiß nicht warum): docs.python.org/3.6/library/re.html#index-32
JHS
36

Der pythonische Weg.

print "".join([ c if c.isalnum() else "*" for c in s ])

Dies betrifft jedoch nicht das Gruppieren mehrerer aufeinanderfolgender nicht übereinstimmender Zeichen, d. H.

"h^&i => "h**inicht "h*i"wie bei den Regex-Lösungen.

baloan
quelle
11

Versuchen:

s = filter(str.isalnum, s)

in Python3:

s = ''.join(filter(str.isalnum, s))

Bearbeiten: erkannte, dass das OP Nicht-Zeichen durch '*' ersetzen möchte. Meine Antwort passt nicht

Don
quelle
11

Verwenden Sie, \Wwas äquivalent zu ist [^a-zA-Z0-9_]. Überprüfen Sie die Dokumentation unter https://docs.python.org/2/library/re.html

Import re
s =  'h^&ell`.,|o w]{+orld'
replaced_string = re.sub(r'\W+', '*', s)
output: 'h*ell*o*w*orld'

Update: Diese Lösung schließt auch Unterstriche aus. Wenn Sie möchten, dass nur Alphabete und Zahlen ausgeschlossen werden, ist eine Lösung von nneonneo besser geeignet.

psun
quelle
1
Beachten Sie, dass \Wdies[^a-zA-Z0-9_] nur in Python 2.x entspricht . In Python 3.x \W+entspricht dies [^a-zA-Z0-9_]nur, wenn re.ASCII/ re.Aflag verwendet wird.
Wiktor Stribiżew