Sostituisci tutti i caratteri non alfanumerici in una stringa


99

Ho una stringa con la quale desidero sostituire qualsiasi carattere che non sia un carattere o un numero standard come (az o 0-9) con un asterisco. Ad esempio, "h ^ & ell`., | Ow] {+ orld" viene sostituito con "h * ell * o * w * orld". Tieni presente che più caratteri come "^ &" vengono sostituiti con un asterisco. Come potrei fare questo?


Risposte:


182

Regex alla riscossa!

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'

7
Se gestisci molto Unicode, potresti anche dover mantenere tutti i simboli Unicode non ASCII:re.sub("[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+", " ", ":%# unicode ΣΘΙП@./\n")
zhazha

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

2
Se esegui più di una sostituzione, questo sarà leggermente più veloce se precompili la regex, ad esempioimport re; regex = re.compile('[^0-9a-zA-Z]+'); regex.sub('*', 'h^&ell.,|o w]{+orld')
Chris

Nota anche \Wper i caratteri non alfanumerici
JHS

36

Il modo pitonico.

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

Tuttavia, questo non si occupa del raggruppamento di più caratteri consecutivi non corrispondenti, ad es

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


11

Provare:

s = filter(str.isalnum, s)

in Python3:

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

Modifica: si è reso conto che l'OP vuole sostituire i non caratteri con '*'. La mia risposta non va bene


11

Usa \Wche è equivalente a [^a-zA-Z0-9_]. Controlla la documentazione, 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'

aggiornamento: questa soluzione escluderà anche il carattere di sottolineatura. Se vuoi escludere solo alfabeti e numeri, la soluzione di nneonneo è più appropriata.


1
Nota che \Wè equivalente a[^a-zA-Z0-9_] solo in Python 2.x. In Python 3.x, \W+è equivalente a [^a-zA-Z0-9_]solo se viene utilizzato re.ASCII/ re.Aflag.
Wiktor Stribiżew
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.