Python elimina cualquier cosa que no sea una letra o un número

Estoy teniendo problemas con las expresiones regulares de Python.

¿Cuál es una buena manera de eliminar todos los caracteres de una cadena que no sean letras o números?

¡Gracias!

[\w] coincidencias (alfanuméricas o de subrayado).

[\W] coincidencias (no (alfanumérico o guión bajo)), que es equivalente a (no alfanumérico ni subrayado)

Necesita [\W_] para eliminar TODOS los no alfanuméricos.

Al usar re.sub (), será mucho más eficiente si reduce el número de sustituciones (costoso) al hacer coincidencias con [\W_]+ lugar de hacerlo de una en una.

Ahora todo lo que necesitas es definir alfanuméricos:

objeto str , solo ASCII A-Za-z0-9:

  re.sub(r'[\W_]+', '', s) 

Objeto str , solo alfanuméricos definidos por locale:

  re.sub(r'[\W_]+', '', s, flags=re.LOCALE) 

Objeto unicode , todos los alfanuméricos:

  re.sub(ur'[\W_]+', u'', s, flags=re.UNICODE) 

Ejemplos para el objeto str :

 >>> import re, locale >>> sall = ''.join(chr(i) for i in xrange(256)) >>> len(sall) 256 >>> re.sub('[\W_]+', '', sall) '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' >>> re.sub('[\W_]+', '', sall, flags=re.LOCALE) '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' >>> locale.setlocale(locale.LC_ALL, '') 'English_Australia.1252' >>> re.sub('[\W_]+', '', sall, flags=re.LOCALE) '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\x83\x8a\x8c\x8e\ x9a\x9c\x9e\x9f\xaa\xb2\xb3\xb5\xb9\xba\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\ xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\ xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\ xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff' # above output wrapped at column 80 

Ejemplo de Unicode:

 >>> re.sub(ur'[\W_]+', u'', u'a_b A_Z \x80\xFF \u0404', flags=re.UNICODE) u'abAZ\xff\u0404' 

'\W' es lo mismo que [^A-Za-z0-9_] más caracteres acentuados de tu localidad.

 >>> re.sub('\W', '', 'text 1, 2, 3...') 'text123' 

Tal vez quieras mantener los espacios o tener todas las palabras (y números):

 >>> re.findall('\w+', 'my. text, --without-- (punctuation) 123') ['my', 'text', 'without', 'punctuation', '123'] 

En la regla de coincidencia del conjunto de caracteres, puede [...] especificar ^ como primer carácter que significa “no está”

 import re re.sub("[^0-9a-zA-Z]", # Anything except 0..9, a..z and A..Z "", # replaced with nothing "this is a test!!") # in this string --> 'thisisatest' 

También puedes intentar usar los métodos isalpha e isnumeric de la siguiente manera:

 text = 'base, sample test;' getVals = lambda x: (c for c in text if c.isalpha() or c.isnumeric()) map(lambda word: ' '.join(getVals(word)): text.split(' ')) 

También hay otras formas que puede considerar, por ejemplo, simplemente hacer un bucle a través de la cadena y omitir caracteres no deseados, por ejemplo, suponiendo que desea eliminar todos los caracteres ascii que no son letras o dígitos

 >>> newstring = [c for c in "a!1#b$2c%3\t\nx" if c in string.letters + string.digits] >>> "".join(newstring) 'a1b2c3x' 

o use string.translate para asignar un carácter a otro o elimine algunos caracteres, por ejemplo

 >>> todelete = [ chr(i) for i in range(256) if chr(i) not in string.letters + string.digits ] >>> todelete = "".join(todelete) >>> "a!1#b$2c%3\t\nx".translate(None, todelete) 'a1b2c3x' 

de esta manera, debe calcular una vez la lista de todelete o una vez puede estar codificado de manera todelete y usarla en cualquier lugar donde necesite convertir una cadena

puede usar expresiones regulares predefinidas en python: \W corresponde al conjunto [^a-zA-Z0-9_] . Entonces,

 import re s = 'Hello dutrow 123' re.sub('\W', '', s) --> 'Hellodutrow123' 

Tienes que ser más específico:

  1. ¿Qué pasa con las “letras” de Unicode? Es decir, aquellos con diacríticos.
  2. ¿Qué pasa con el espacio en blanco? (Supongo que esto es lo que QUIERES eliminar junto con la puntuación)
  3. Cuando dices “letras”, ¿te refieres a AZ y az solo en ASCII?
  4. Cuando dices “números”, ¿te refieres a 0-9 solamente? ¿Qué pasa con los decimales, separadores y exponentes?

Se vuelve complejo rápidamente …

Un buen lugar para comenzar es un sitio interactivo de expresiones regulares, como RegExr

También puedes obtener Python Regex Tool específica para Python