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?


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'

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.


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


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.