2012-10-20 19 views
48

Ho una stringa con cui voglio sostituire qualsiasi carattere che non sia un carattere standard o un numero come (a-z o 0-9) con un asterisco. Ad esempio, "h^& ell`., | Ow] {+ orld" è sostituito da "h * ell * o * w * orld". Nota che più caratteri come "^ &" vengono sostituiti con un asterisco. Come potrei fare questo?Sostituisci tutti i caratteri non alfanumerici in una stringa

+1

Eventuali duplicati di [Spogliarello tutto, ma caratteri alfanumerici da una stringa in Python] (http://stackoverflow.com/questions/1276764/stripping-everything-but-alphanumeric-chars-from -a-string-in-python) – sds

risposta

99

Regex al salvataggio!

import re 

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

Esempio:

>>> re.sub('[^0-9a-zA-Z]+', '*', 'h^&ell`.,|o w]{+orld') 
'h*ell*o*w*orld' 
+5

Se si gestisce molto l'unicode, potrebbe essere necessario conservare tutti i simboli Unicode non ASCII: 're.sub (" [\ x00- \ x2F \ x3A- \ x40 \ x5B- \ x60 \ x7B- \ x7F] + "," ",":% # unicode ΣΘΙП @./\ n ")' – zhazha

+0

Se vuoi mantenere degli spazi nella stringa, aggiungi uno spazio tra parentesi: s = re .sub ('[^ 0-9a-zA-Z] +', '*', s) – stackPusher

23

Il modo divinatorio.

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

Questo non riguarda un raggruppamento di più caratteri non corrispondenti consecutivi però, cioè

"h^&i => "h**i non "h*i" come nelle soluzioni regex.

6

Prova:

s = filter(str.isalnum, s) 

Edit: capito che il PO vuole sostituire i non-caratteri con '*'. La mia risposta non si adatta

5

Utilizzare \W che include tutti i non-alfanumerali [a-zA-Z0-9]. Controllare la documentazione, https://docs.python.org/2/library/re.html

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