Eliminar todos los espacios en blanco en una cadena

788

Quiero eliminar todo el espacio en blanco de una cadena, en ambos extremos y entre palabras.

Tengo este código de Python:

def my_handle(self):
    sentence = ' hello  apple  '
    sentence.strip()

Pero eso solo elimina el espacio en blanco en ambos lados de la cadena. ¿Cómo elimino todos los espacios en blanco?

co2f2e
fuente
44
¿Cómo debería ser tu resultado? hello apple? helloapple?
Mark Byers
44
@JoachimPileborg, no exactamente, creo, porque también se trata de reducir los espacios en blanco entre las palabras.
wal-o-mat
3
helloapple debe ser mi salida
co2f2e
8
Corríjame si está equivocado, pero "espacio en blanco" no es sinónimo de "caracteres de espacio". La respuesta actual marcada como correcta no elimina todos los espacios en blanco . Pero, dado que está marcado como correcto, ¿debe haber respondido la pregunta prevista? Entonces, ¿deberíamos editar la pregunta para reflejar la respuesta aceptada? @Kalanamith ¿Desea o desea eliminar todos los espacios en blanco o solo espacios?
AnnanFay

Respuestas:

1659

Si desea eliminar los espacios iniciales y finales, use str.strip():

sentence = ' hello  apple'
sentence.strip()
>>> 'hello  apple'

Si desea eliminar todos los caracteres de espacio, use str.replace():

(Nota: esto solo elimina el carácter de espacio ASCII "normal" ' ' U+0020pero no cualquier otro espacio en blanco )

sentence = ' hello  apple'
sentence.replace(" ", "")
>>> 'helloapple'

Si desea eliminar espacios duplicados, use str.split():

sentence = ' hello  apple'
" ".join(sentence.split())
>>> 'hello apple'
Cédric Julien
fuente
42
La grandeza de esta función es que también elimina el '\ r \ n' del archivo html que recibí de Beautiful Soup.
lsheng
27
Me gusta "" .join (oración.split ()), esto elimina todos los espacios en blanco (espacios, pestañas, líneas nuevas) de cualquier parte de la oración.
don
Principiante aquí. ¿Alguien puede explicarme por qué los resultados de print (oración.junta (oración.plice ()) a 'hola hola manzana'? Solo quiero entender cómo se procesa el código aquí.
Yannis Dran
2
@YannisDran revisa la documentación de str.join () , cuando llamas sentence.join(str_list)le pides a Python que combine elementos de str_list con un sentenceseparador.
Cédric Julien
1
"".join(sentence.split())es de hecho la solución canónica, eliminando eficientemente todos los espacios en blanco en lugar de simplemente espacios. La excelente respuesta de Mark Byers probablemente debería haber sido aceptada en lugar de esta respuesta menos aplicable.
Cecil Curry
263

Para eliminar solo espacios use str.replace:

sentence = sentence.replace(' ', '')

Para eliminar todos los espacios en blanco (espacio, tabulación, nueva línea, y así sucesivamente) que puede utilizar splita continuación join:

sentence = ''.join(sentence.split())

o una expresión regular:

import re
pattern = re.compile(r'\s+')
sentence = re.sub(pattern, '', sentence)

Si solo desea eliminar espacios en blanco desde el principio y el final, puede usar strip:

sentence = sentence.strip()

También puede usar lstrippara eliminar espacios en blanco solo desde el comienzo de la cadena, y rstrippara eliminar espacios en blanco desde el final de la cadena.

Mark Byers
fuente
Nota: No necesita compilar el paso, re.sub (y amigos) almacena en caché el patrón compilado. Ver también, la respuesta de Emil .
Andy Hayden
python3:yourstr.translate(str.maketrans('', '', ' \n\t\r'))
deed02392
104

Una alternativa es usar expresiones regulares y hacer coincidir estos extraños caracteres de espacio en blanco también. Aquí hay unos ejemplos:

Elimine TODOS los espacios en una cadena, incluso entre palabras:

import re
sentence = re.sub(r"\s+", "", sentence, flags=re.UNICODE)

Eliminar espacios al COMIENZO de una cadena:

import re
sentence = re.sub(r"^\s+", "", sentence, flags=re.UNICODE)

Eliminar espacios al final de una cadena:

import re
sentence = re.sub(r"\s+$", "", sentence, flags=re.UNICODE)

Elimine espacios tanto al PRINCIPIO como al FINAL de una cadena:

import re
sentence = re.sub("^\s+|\s+$", "", sentence, flags=re.UNICODE)

Eliminar SOLO espacios DUPLICADOS:

import re
sentence = " ".join(re.split("\s+", sentence, flags=re.UNICODE))

(Todos los ejemplos funcionan tanto en Python 2 como en Python 3)

Emil Stenström
fuente
No funcionó para "\ u202a1234 \ u202c". Da el mismo resultado: u '\ u202a1234 \ u202c'
Sarang
@Sarang: No se trata de caracteres de espacio en blanco (búscalos en Google y verás) sino "Puntuación general". Mi respuesta solo trata con la eliminación de caracteres clasificados como espacios en blanco.
Emil Stenström
Esta es la única solución que veo aquí que elimina esos malditos caracteres de espacio en blanco unicode molestos, gracias fam
CapnShanty
41

El espacio en blanco incluye espacio, pestañas y CRLF . Entonces, una función de cadena elegante y de una línea que podemos usar es str.translate:

Python 3

' hello  apple'..translate(str.maketrans('', '', ' \n\t\r'))

O si quieres ser minucioso:

import string
' hello  apple'..translate(str.maketrans('', '', string.whitespace))

Python 2

' hello  apple'.translate(None, ' \n\t\r')

O si quieres ser minucioso:

import string
' hello  apple'.translate(None, string.whitespace)
MaK
fuente
2
Esto no ayudará con espacios en blanco Unicode como\xc2\xa0
Suzana
55
ans.translate( None, string.whitespace )produce solo builtins.TypeError: translate() takes exactly one argument (2 given)para mi. Docs dice que el argumento es una tabla de traducción, vea string.maketrans (). Pero vea el comentario de Amnon Harel, a continuación.
user405
2
' hello apple'.translate(str.maketrans('', '', string.whitespace))Nota: es mejor hacer una variable para almacenar la tabla trans si tiene la intención de hacerlo varias veces.
Shogan Aversa-Druesne
16

Para eliminar espacios en blanco desde el principio y el final, use strip.

>> "  foo bar   ".strip()
"foo bar"
wal-o-mat
fuente
1
La pregunta específicamente pide eliminar todo el espacio en blanco y no solo en los extremos. Por favor toma nota.
Shayan Shafiq
9
' hello  \n\tapple'.translate({ord(c):None for c in ' \n\t\r'})

MaK ya señaló el método de "traducción" anterior. Y esta variación funciona con Python 3 (ver estas preguntas y respuestas ).

Amnon Harel
fuente
2
¡Gracias! O, xxx.translate( { ord(c) :None for c in string.whitespace } )por minuciosidad.
user405
7

Ten cuidado:

strip realiza un rstrip y lstrip (elimina los espacios iniciales y finales, las pestañas, los retornos y los feeds de formularios, pero no los elimina en el medio de la cadena).

Si solo reemplaza espacios y pestañas, puede terminar con CRLF ocultos que parecen coincidir con lo que está buscando, pero no son lo mismo.

yan bellavance
fuente
3
import re    
sentence = ' hello  apple'
re.sub(' ','',sentence) #helloworld (remove all spaces)
re.sub('  ',' ',sentence) #hello world (remove double spaces)
PrabhuPrakash
fuente
3
la pregunta también era eliminar todo el espacio en blanco que incluye pestañas y nuevos caracteres de línea, este fragmento solo eliminará los espacios regulares.
Maximilian Peters
3

Además, la tira tiene algunas variaciones:

Eliminar espacios al principio y al final de una cadena:

sentence= sentence.strip()

Eliminar espacios al COMIENZO de una cadena:

sentence = sentence.lstrip()

Eliminar espacios al final de una cadena:

sentence= sentence.rstrip()

Las tres funciones de cadena strip lstrip, y rstrippueden tomar parámetros de la cadena para despojar, siendo el valor predeterminado todo el espacio en blanco. Esto puede ser útil cuando está trabajando con algo en particular, por ejemplo, podría eliminar solo espacios pero no líneas nuevas:

" 1. Step 1\n".strip(" ")

O podría eliminar comas adicionales al leer en una lista de cadenas:

"1,2,3,".strip(",")
Anna
fuente
1

elimine todo el espacio en blanco de una cadena, en ambos extremos y entre palabras.

>>> import re
>>> re.sub("\s+", # one or more repetition of whitespace
    '', # replace with empty string (->remove)
    ''' hello
...    apple
... ''')
'helloapple'

Documentos de Python:

encargarse de
fuente
Sé que rese sugirió antes, pero descubrí que la respuesta real al título de la pregunta estaba un poco oculta entre todas las otras opciones.
manejar el