Nuestro equipo de redactores ha pasado mucho tiempo buscando la resolución a tu interrogante, te regalamos la respuesta por esto deseamos serte de mucha ayuda.
Solución:
Aprovechando el comportamiento de str.split sin parámetro sep:
>>> s = " t foo n bar "
>>> "".join(s.split())
'foobar'
Si solo desea eliminar espacios en lugar de todos los espacios en blanco:
>>> s.replace(" ", "")
'tfoonbar'
Optimización prematura
Aunque la eficiencia no es el objetivo principal (escribir un código claro sí lo es), aquí hay algunos tiempos iniciales:
$ python -m timeit '"".join(" t foo n bar ".split())'
1000000 loops, best of 3: 1.38 usec per loop
$ python -m timeit -s 'import re' 're.sub(r"s+", "", " t foo n bar ")'
100000 loops, best of 3: 15.6 usec per loop
Tenga en cuenta que la expresión regular se almacena en caché, por lo que no es tan lenta como se imagina. Compilarlo de antemano ayuda a algunos, pero solo importaría en la práctica si llamas a esto muchos veces:
$ python -m timeit -s 'import re; e = re.compile(r"s+")' 'e.sub("", " t foo n bar ")'
100000 loops, best of 3: 7.76 usec per loop
Aunque re.sub es 11,3 veces más lento, recuerda que tus cuellos de botella seguramente están en otra parte. La mayoría de los programas no notarían la diferencia entre cualquiera de estas 3 opciones.
Para Python 3:
>>> import re
>>> re.sub(r's+', '', 'strip my ntr ASCII and u00A0 u2003 Unicode spaces')
'stripmyASCIIandUnicodespaces'
>>> # Or, depending on the situation:
>>> re.sub(r'(s|u180B|u200B|u200C|u200D|u2060|uFEFF)+', '',
... 'uFEFFttt strip all u000A kinds of u200B whitespace n')
'stripallkindsofwhitespace'
… maneja cualquier carácter de espacio en blanco en el que no esté pensando, y créanos, hay muchos.
s
por sí solo siempre cubre el espacio en blanco ASCII:
- espacio (regular)
- pestaña
- nueva linea (n)
- retorno de carro (r)
- alimentación de formulario
- pestaña vertical
Además:
- para Python 2 con
re.UNICODE
activado, - para Python 3 sin ninguna acción adicional,
…s
también cubre los caracteres de espacio en blanco de Unicode, por ejemplo:
- espacio irrompible,
- em espacio,
- espacio ideográfico,
…etc. Consulte la lista completa aquí, en “Caracteres Unicode con la propiedad White_Space”.
Sin embargo s
NO cubre caracteres no clasificados como espacios en blanco, que son espacios en blanco de facto, como entre otros:
- carpintero de ancho cero,
- separador de vocales mongol,
- espacio ininterrumpido de ancho cero (también conocido como marca de orden de bytes),
…etc. Consulte la lista completa aquí, en “Caracteres Unicode relacionados sin la propiedad White_Space”.
Entonces estos 6 caracteres están cubiertos por la lista en la segunda expresión regular, u180B|u200B|u200C|u200D|u2060|uFEFF
.
Fuentes:
- https://docs.python.org/2/library/re.html
- https://docs.python.org/3/library/re.html
- https://en.wikipedia.org/wiki/Unicode_character_property
Alternativamente,
"strip my spaces".translate( None, string.whitespace )
Y aquí está la versión de Python3:
"strip my spaces".translate(str.maketrans('', '', string.whitespace))