Cómo quitar todo el espacio en blanco de la cadena


179

¿Cómo elimino todos los espacios en una cadena de Python? Por ejemplo, quiero strip my spacesque se convierta una cadena como stripmyspaces, pero parece que no puedo lograr eso con strip():

>>> 'strip my spaces'.strip()
'strip my spaces'

13
Tenga en cuenta que str.strip solo afecta los espacios en blanco iniciales y finales.

Respuestas:


311

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(" ", "")
'\tfoo\nbar'

Optimización prematura

A pesar de que 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 imagina. Compilarlo de antemano ayuda a algunos, pero solo sería importante en la práctica si llama a esto muchas 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, recuerde que sus cuellos de botella están seguramente en otro lugar. La mayoría de los programas no notarían la diferencia entre cualquiera de estas 3 opciones.


Probablemente sea más lento que la \s+sustitución. Me quedaría con re.
OTZ

@OTZ: Puede que se sorprenda, pero vea la nota "recordar".

@Roger Hmm. interesante. ¿Has probado el s.translatemétodo por casualidad? Probablemente supera todos los métodos que se muestran en esta página.
OTZ

@Roger Pate: No es necesario el argumento de 'mesa' para traducir, puede ser None- aunque, sorprendentemente, que hace que sea más lento ...
martineau

1
Tratar myString.translate(None, " \t\r\n\v"). Solo toma 83% mientras la técnica más rápida de Roger (dividir y unir). No estoy seguro si cubre todos los caracteres de espacio en blanco que divide, pero probablemente será suficiente para la mayoría de las aplicaciones ASCII.
brianmearns

60
>>> import re
>>> re.sub(r'\s+', '', 'strip my spaces')
'stripmyspaces'

También maneja los caracteres de espacios en blanco en los que no estás pensando (créeme, hay muchos).


3
Esta es una solución mucho menos extravagante que la respuesta aceptada.
John Smith

Esto es más explícito que las otras respuestas, por lo que toma el pastel para mí.
Tristan

34

Alternativamente,

"strip my spaces".translate( None, string.whitespace )

Y aquí está la versión de Python3:

"strip my spaces".translate(str.maketrans('', '', string.whitespace))

Esto parece el más pitónico. ¿Por qué no ha sido votado a la cima?
rbp

El código de Python 3 en la respuesta funciona. Comentario de @DanMenes es obsoleto
igo

3
NameError: name 'string' is not defined.
Zelphir Kaltstahl el

@ZelphirKaltstahl necesitasimport string
Shahryar Saljoughi

13

Lo más simple es usar reemplazar:

"foo bar\t".replace(" ", "").replace("\t", "")

Alternativamente, use una expresión regular:

import re
re.sub(r"\s", "", "foo bar\t")

10

Eliminar los espacios iniciales en Python

string1="    This is Test String to strip leading space"
print string1
print string1.lstrip()

Eliminar los espacios finales o finales en Python

string2="This is Test String to strip trailing space     "
print string2
print string2.rstrip()

Elimine los espacios en blanco del principio y el final de la cadena en Python

string3="    This is Test String to strip leading and trailing space      "
print string3
print string3.strip()

Eliminar todos los espacios en python

string4="   This is Test String to test all the spaces        "
print string4
print string4.replace(" ", "")

3

Prueba una expresión regular con re.sub. Puede buscar todos los espacios en blanco y reemplazarlos con una cadena vacía.

\sen su patrón coincidirá con los espacios en blanco, y no solo un espacio (pestañas, líneas nuevas, etc.). Puede leer más al respecto en el manual .


No sé cómo usar expresiones regulares :(
wrongusername

@wrongusername: actualizado con un enlace a la página de manual del módulo re.
Matthew Iselin

2
import re
re.sub(' ','','strip my spaces')

3
Bienvenido a SO. Aunque le agradecemos su respuesta, sería mejor si proporcionara un valor adicional además de las otras respuestas. En este caso, su respuesta no proporciona un valor adicional, ya que otro usuario ya publicó esa solución. Si una respuesta anterior fue útil para usted, debe votarla una vez que tenga suficiente reputación
Maximilian Peters

Esto no responde a la pregunta "cómo eliminar todo el espacio en blanco". Solo elimina espacios
Nick

2

Como mencionó Roger Pate, el siguiente código funcionó para mí:

s = " \t foo \n bar "
"".join(s.split())
'foobar'

Estoy usando Jupyter Notebook para ejecutar el siguiente código:

i=0
ProductList=[]
while i < len(new_list): 
   temp=''                            # new_list[i]=temp=' Plain   Utthapam  '
   #temp=new_list[i].strip()          #if we want o/p as: 'Plain Utthapam'
   temp="".join(new_list[i].split())  #o/p: 'PlainUtthapam' 
   temp=temp.upper()                  #o/p:'PLAINUTTHAPAM' 
   ProductList.append(temp)
   i=i+2

2

Se aplican las técnicas estándar para filtrar una lista, aunque no son tan eficientes como los métodos split/joino translate.

Necesitamos un conjunto de espacios en blanco:

>>> import string
>>> ws = set(string.whitespace)

El filterincorporado:

>>> "".join(filter(lambda c: c not in ws, "strip my spaces"))
'stripmyspaces'

Una lista de comprensión (sí, use los corchetes: consulte el punto de referencia a continuación):

>>> import string
>>> "".join([c for c in "strip my spaces" if c not in ws])
'stripmyspaces'

Un pliegue:

>>> import functools
>>> "".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))
'stripmyspaces'

Punto de referencia:

>>> from timeit import timeit
>>> timeit('"".join("strip my spaces".split())')
0.17734256500003198
>>> timeit('"strip my spaces".translate(ws_dict)', 'import string; ws_dict = {ord(ws):None for ws in string.whitespace}')
0.457635745999994
>>> timeit('re.sub(r"\s+", "", "strip my spaces")', 'import re')
1.017787621000025

>>> SETUP = 'import string, operator, functools, itertools; ws = set(string.whitespace)'
>>> timeit('"".join([c for c in "strip my spaces" if c not in ws])', SETUP)
0.6484303600000203
>>> timeit('"".join(c for c in "strip my spaces" if c not in ws)', SETUP)
0.950212219999969
>>> timeit('"".join(filter(lambda c: c not in ws, "strip my spaces"))', SETUP)
1.3164566040000523
>>> timeit('"".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))', SETUP)
1.6947649049999995

0

TL / DR

Esta solución fue probada usando Python 3.6

Para quitar todos los espacios de una cadena en Python3, puede usar la siguiente función:

def remove_spaces(in_string: str):
    return in_string.translate(str.maketrans({' ': ''})

Para eliminar los caracteres de espacio en blanco ('\ t \ n \ r \ x0b \ x0c') puede usar la siguiente función:

import string
def remove_whitespace(in_string: str):
    return in_string.translate(str.maketrans(dict.fromkeys(string.whitespace)))

Explicación

El str.translatemétodo de Python es un método de clase incorporado de str, toma una tabla y devuelve una copia de la cadena con cada carácter asignado a través de la tabla de traducción aprobada. Documentación completa para str.translate

Para crear la tabla de traducción str.maketransse utiliza. Este método es otro método de clase integrado de str. Aquí lo usamos con un solo parámetro, en este caso un diccionario, donde las claves son los caracteres a ser reemplazados asignados a valores con el valor de reemplazo de caracteres. Devuelve una tabla de traducción para usar con str.translate. Documentación completa para str.maketrans

El stringmódulo en python contiene algunas operaciones de cadena y constantes comunes. string.whitespacees una constante que devuelve una cadena que contiene todos los caracteres ASCII que se consideran espacios en blanco. Esto incluye el espacio de caracteres, tabulación, salto de línea, retorno, avance de página y tabulación vertical. Documentación completa para cadena

En la segunda función dict.fromkeysse utiliza para crear un diccionario donde las claves son los caracteres de la cadena devueltos por string.whitespacecada uno con valor None. Documentación completa para dict.fromkeys


0

Si el rendimiento óptimo no es un requisito y solo desea algo absolutamente simple, puede definir una función básica para probar cada carácter utilizando el método "isspace" integrado en la clase de cadena:

def remove_space(input_string):
    no_white_space = ''
    for c in input_string:
        if not c.isspace():
            no_white_space += c
    return no_white_space

Construir la no_white_spacecadena de esta manera no tendrá un rendimiento ideal, pero la solución es fácil de entender.

>>> remove_space('strip my spaces')
'stripmyspaces'

Si no desea definir una función, puede convertirla en algo vagamente similar con la comprensión de la lista. Tomando prestado de la joinsolución de la respuesta superior :

>>> "".join([c for c in "strip my spaces" if not c.isspace()])
'stripmyspaces'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.