Elimina los espacios en blanco en Python usando string.whitespace

El string.whitespace de Python es genial:

>>> string.whitespace '\t\n\x0b\x0c\r ' 

¿Cómo utilizo esto con una cadena sin tener que volver a escribir manualmente ‘\ t | \ n | … etc para expresiones regulares?

Por ejemplo, debería ser capaz de activar: “Por favor \ n no \ t me lastime \ x0b”.

dentro

“Por favor no me hagas daño”.

    Probablemente querría mantener los espacios individuales, pero sería lo suficientemente fácil solo para ir a string.whitespace [: – 1] Supongo.

    ¡Hay un atajo especial para este caso de uso exactamente!

    Si llama a str.split sin un argumento, se divide en ejecuciones de espacios en blanco en lugar de caracteres individuales. Asi que:

     >>> ' '.join("Please \n don't \t hurt \x0b me.".split()) "Please don't hurt me." 

    ¿Qué pasa con la clase de caracteres?

     >>> import re >>> pattern = re.compile(r'\s+') >>> re.sub(pattern, ' ', "Please \n don't \t hurt \x0b me.") "Please don't hurt me." 

    Hagamos algunas suposiciones razonables:

    (1) Realmente desea reemplazar cualquier serie de caracteres de espacio en blanco con un solo espacio (una ejecución es de longitud 1 o mayor).

    (2) Le gustaría que el mismo código funcione con cambios mínimos en Python 2.X con objetos Unicode.

    (3) No desea que su código asum cosas que no están garantizadas en los documentos

    (4) Le gustaría que el mismo código funcione con cambios mínimos con los objetos de la serie 3.X de Python.

    La respuesta seleccionada actualmente tiene estos problemas:

    (a) cambia " " * 3 a " " * 2 es decir, elimina espacios duplicados pero no espacios triplicados, cuadruplicados, etc. [falla el requisito 1]

    (b) cambia "foo\tbar\tzot" a "foobarzot" [falla el requisito 1]

    (c) cuando se alimenta un objeto Unicode, obtiene TypeError: translate() takes exactly one argument (2 given) [falla el requisito 2]

    (d) utiliza string.whitespace[:-1] [falla el requisito 3; orden de los caracteres en string.whitespace no está garantizado]

    (e) utiliza string.whitespace[:-1] [falla el requisito 4; en Python 2.X, string.whitespace es '\t\n\x0b\x0c\r ' ; en Python 3.X, es ‘\ t \ n \ r \ x0b \ x0c’]

    La " ".join(s.split()) y la respuesta re.sub(r"\s+", " ", s) no tienen estos problemas.

    Podrías usar el método de traducir

     import string s = "Please \n don't \t hurt \x0b me." s = s.translate(None, string.whitespace[:-1]) # python 2.6 and up s = s.translate(string.maketrans('',''), string.whitespace[:-1]) # python 2.5, dunno further down >>> s "Please don't hurt me." 

    Y luego eliminar los espacios en blanco duplicados

     s.replace(' ', ' ') >>> s "Please don't hurt me." 

    un punto de partida … (aunque no es más corto que el assembly manual del circo de espacios en blanco) …

     >>> from string import whitespace as ws >>> import re >>> p = re.compile('(%s)' % ('|'.join([c for c in ws]))) >>> s = "Please \n don't \t hurt \x0b me." >>> p.sub('', s) "Pleasedon'thurtme." 

    O si desea reducir los espacios en blanco a un máximo de uno:

     >>> p1 = re.compile('(%s)' % ('|'.join([c for c in ws if not c == ' ']))) >>> p2 = re.compile(' +') >>> s = "Please \n don't \t hurt \x0b me." >>> p2.sub(' ', p1.sub('', s)) "Please don't hurt me." 

    Tercera forma, más compacta:

     >>> import string >>> s = "Please \n don't \t hurt \x0b me." >>> s.translate(None, string.whitespace[]) "Pleasedon'thurtme." >>> s.translate(None, string.whitespace[:5]) "Please don't hurt me." >>> ' '.join(s.translate(None, string.whitespace[:5]).split()) "Please don't hurt me."