Reemplazar todos los caracteres no alfanuméricos en una cadena

99

Tengo una cadena con la que quiero reemplazar cualquier carácter que no sea un carácter o número estándar, como (az o 0-9) con un asterisco. Por ejemplo, "h ^ & ell`., | Ow] {+ orld" se reemplaza por "h * ell * o * w * orld". Tenga en cuenta que varios caracteres como "^ &" se reemplazan con un asterisco. ¿Cómo haría esto?

tchadwik
fuente

Respuestas:

182

¡Regex al rescate!

import re

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

Ejemplo:

>>> re.sub('[^0-9a-zA-Z]+', '*', 'h^&ell`.,|o w]{+orld')
'h*ell*o*w*orld'
neonneo
fuente
7
Si maneja mucho Unicode, es posible que también deba mantener todos los símbolos Unicode que no sean ASCII:re.sub("[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+", " ", ":%# unicode ΣΘΙП@./\n")
zhazha
Si desea mantener espacios en su cadena, simplemente agregue un espacio entre corchetes: s = re.sub ('[^ 0-9a-zA-Z] +', '*', s)
stackPusher
2
Si realiza más de un reemplazo, esto funcionará un poco más rápido si precompila la expresión regular, por ejemplo,import re; regex = re.compile('[^0-9a-zA-Z]+'); regex.sub('*', 'h^&ell.,|o w]{+orld')
Chris
También tenga en \Wcuenta que para los caracteres que no son palabras, es casi lo mismo, pero permite el guión bajo como un carácter de palabra (no sé por qué): docs.python.org/3.6/library/re.html#index-32
JHS
36

La forma pitónica.

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

Sin embargo, esto no se ocupa de agrupar varios caracteres consecutivos que no coinciden, es decir

"h^&i => "h**ino "h*i"como en las soluciones de expresiones regulares.

baloan
fuente
11

Tratar:

s = filter(str.isalnum, s)

en Python3:

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

Editar: se dio cuenta de que el OP quiere reemplazar los no caracteres con '*'. Mi respuesta no encaja

Don
fuente
11

Utilice \Wque sea equivalente a [^a-zA-Z0-9_]. Consulte la documentación, 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'

actualización: esta solución también excluirá el subrayado. Si desea excluir solo alfabetos y números, entonces la solución de nneonneo es más apropiada.

psun
fuente
1
Tenga en cuenta que \Wes equivalente a[^a-zA-Z0-9_] solo en Python 2.x. En Python 3.x, \W+es equivalente a [^a-zA-Z0-9_]solo si se usa re.ASCII/ re.Aflag.
Wiktor Stribiżew