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?


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'

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.


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


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.