Necesito eliminar todos los caracteres especiales, signos de puntuación y espacios de una cadena para que solo tenga letras y números.
236
Esto se puede hacer sin expresiones regulares:
>>> string = "Special $#! characters spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'
Puedes usar str.isalnum
:
S.isalnum() -> bool Return True if all characters in S are alphanumeric and there is at least one character in S, False otherwise.
Si insiste en usar expresiones regulares, otras soluciones funcionarán bien. Sin embargo, tenga en cuenta que si se puede hacer sin usar una expresión regular, esa es la mejor manera de hacerlo.
isalnum()
versiones regex y regex, y la expresión regular es 50-75% más rápidaAquí hay una expresión regular para que coincida con una cadena de caracteres que no son letras o números:
Aquí está el comando Python para hacer una sustitución de expresiones regulares:
fuente
+
cuantificador para mejorar un poco su eficiencia.)[^A-Za-z0-9 ]+
Camino más corto:
Si desea espacios entre palabras y números, sustituya '' por ''
fuente
r'\W+'
- ligeramente fuera de tema (y muy pedante) pero sugiero un hábito de que todos los patrones de expresiones regulares sean cadenas sin procesarDespués de ver esto, estaba interesado en ampliar las respuestas proporcionadas descubriendo cuál se ejecuta en la menor cantidad de tiempo, así que revisé algunas de las respuestas propuestas con
timeit
dos de las cadenas de ejemplo:string1 = 'Special $#! characters spaces 888323'
string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'
Ejemplo 1
'.join(e for e in string if e.isalnum())
string1
- Resultado: 10.7061979771string2
- Resultado: 7.78372597694Ejemplo 2
import re re.sub('[^A-Za-z0-9]+', '', string)
string1
- Resultado: 7.10785102844string2
- Resultado: 4.12814903259Ejemplo 3
import re re.sub('\W+','', string)
string1
- Resultado: 3.11899876595string2
- Resultado: 2.78014397621Los resultados anteriores son un producto del resultado más bajo devuelto de un promedio de:
repeat(3, 2000000)
El ejemplo 3 puede ser 3 veces más rápido que el ejemplo 1 .
fuente
''.join([*filter(str.isalnum, string)])
Python 2. *
Creo que solo
filter(str.isalnum, string)
funcionaPython 3. *
En Python3, la
filter( )
función devolvería un objeto itertable (en lugar de una cadena a diferencia de lo anterior). Uno tiene que unirse para obtener una cadena de itertable:o para pasar el
list
uso de combinación ( no estoy seguro pero puede ser un poco rápido )nota: desempaquetado
[*args]
válido desde Python> = 3.5fuente
map
,filter
yreduce
vuelve objeto itertable lugar. Todavía en Python3 + preferiré''.join(filter(str.isalnum, string))
(o aprobar la lista en combinación''.join([*filter(str.isalnum, string)])
) sobre la respuesta aceptada.''.join(filter(str.isalnum, string))
es una mejorafilter(str.isalnum, string)
, al menos para leer. ¿Es esta realmente la forma Pythreenic (sí, puedes usar eso) para hacer esto?filter(str.isalnum, string)
no devolver la cadena en Python3 comofilter( )
en Python-3 devuelve el iterador en lugar del tipo de argumento a diferencia de Python-2. +puedes agregar más caracteres especiales y eso será reemplazado por "no significa nada, es decir, serán eliminados.
fuente
A diferencia de lo que todos los demás usaban regex, trataría de excluir cada personaje que no sea lo que quiero, en lugar de enumerar explícitamente lo que no quiero.
Por ejemplo, si solo quiero caracteres de 'a a z' (mayúsculas y minúsculas) y números, excluiría todo lo demás:
Esto significa "sustituir cada carácter que no sea un número o un carácter en el rango 'a a z' o 'A a Z' con una cadena vacía".
De hecho, si inserta el carácter especial
^
en el primer lugar de su expresión regular, obtendrá la negación.Consejo adicional: si también necesita minúsculas el resultado, puede hacer que la expresión regular sea aún más rápida y fácil, siempre que no encuentre mayúsculas ahora.
fuente
Suponiendo que desea usar una expresión regular y desea / necesita un código 2.x compatible con Unicode que esté listo para 2to3:
fuente
fuente
El enfoque más genérico es usar las 'categorías' de la tabla unicodedata que clasifica cada carácter. Por ejemplo, el siguiente código filtra solo los caracteres imprimibles según su categoría:
Mire la URL dada arriba para todas las categorías relacionadas. Por supuesto, también puede filtrar por categorías de puntuación.
fuente
$
al final de cada línea?string.punctuation contiene los siguientes caracteres:
Puede usar las funciones de traducción y conversión para asignar signos de puntuación a valores vacíos (reemplazar)
Salida:
fuente
Usa traductor:
Advertencia: solo funciona en cadenas ASCII.
fuente
TypeError: translate() takes exactly one argument (2 given)
con py3.4igual que las comillas dobles "" "
fuente
y verás tu resultado como
'askhnlaskdjalsdk
fuente
re
pero nunca lo usaste. Susreplace
criterios solo funcionan para esta cadena específica. ¿Qué pasa si tu cuerda esabc = "askhnl#$%!askdjalsdk"
? No creo que funcione en otra cosa que no sea el#$%
patrón. Podría querer modificarloEliminar signos de puntuación, números y caracteres especiales
Ejemplo:
Código
Resultado:-
Gracias :)
fuente
Para otros idiomas como el alemán, español, danés, francés, etc., que contienen caracteres especiales (como el alemán "Umlaute", como
ü
,ä
,ö
) simplemente añadir estos a la cadena de búsqueda de expresiones regulares:Ejemplo para alemán:
fuente