2011-08-22 32 views
5

A veces tengo cadenas con caracteres extraños. No son visibles en el navegador, pero son parte de la cadena y se cuentan en len(). ¿Cómo puedo deshacerme de él? Strip() borra el espacio normal pero no los signos.Python: cómo eliminar signos ocultos de la cadena?

+0

Ver esta solución: http://stackoverflow.com/questions/92438/stripping-non-printable-characters-from-a-string-in-python –

Respuesta

2

conjunto Collect de caracteres que desea activar y eliminar el resto como esto

import re 
text = re.sub("[^a-z0-9]+","", text, flags=re.IGNORECASE)

que se eliminarán todos los caracteres que no sean de A a Z, A a la Z y de 0 a 9.

+0

necesito signos utf8 conjunto completo:/ – robos85

+0

@ robos85, se Necesito información para desnudarme o no. Entonces, ¿puedo suponer que necesita quitar todos los caracteres no válidos para utf8? hay una solución para eso, pero que podría incluir caracteres no visibles/no imprimibles. – YOU

11

Uso las categorías de caracteres del módulo string. Si desea permitir que todos los caracteres imprimibles, puede hacerlo

from string import printable 
new_string = ''.join(char for char in the_string if char in printable) 

Sobre la respuesta es usted, usted puede hacer esto con re.sub también:

new_string = re.sub("[^{}]+".format(printable), "", the_string) 

Además, si usted quiere ver todos los caracteres en una cadena, incluso los no imprimibles, siempre se puede hacer

print repr(the_string) 

que mostrará cosas como \x00 de caracteres no imprimibles.

+0

Seguramente esta es la respuesta correcta. – dotancohen

+0

La respuesta de segundos funcionó como el encanto, gracias. – Yehonatan

1

Las expresiones regulares son una herramienta buena y muy universal para todo tipo de análisis de cadenas. Si la velocidad es un problema, el método "traducir" de la clase de cadena también puede ayudarlo.

En primer lugar, definir una ('identidad') de mapeo, que no va a cambiar nada:

mapping = map(chr, range(256)) 

si desea reemplazar cada "a" por una "b", modifica su asignación

mapping[ord('a')] = 'b' 

Ahora se construye la tabla para el método de "traducir":

table = "".join(mapping) 

y

print "abc".translate(table) 

imprime "bbc".

Si realmente quiere eliminar la "a", que no modifique el mapeo anterior, construir la tabla y luego llamar traduce de la siguiente manera:

print "abc".translate(table, "a") 

le da "BC".

Una vez construida la tabla, el método de traducción es muy rápido.

Así que en su caso se puede modificar la asignación de tal manera que todos sus caracteres no deseados se asignan a un espacio en blanco

mapping = map(chr, range(256)) 
table = "".join(" " if c in unwanted_chars else c for c in map(chr, range(256))) 

y utilizar len("my string".translate(table).trim()) que ignora los caracteres no deseados al principio y al final de la cadena.

O utiliza len("my string".translate(table, unwanted_chars)) que ignorará todos los caracteres no deseados.

+0

Agradable. +1 mañana cuando tenga votos de nuevo. Pensé en traducir, pero era demasiado vago para buscar la sintaxis. – agf

Cuestiones relacionadas