Como retirar todo o espaço em branco da string

179

Como removo todos os espaços em uma string python? Por exemplo, eu quero que uma string strip my spacesseja transformada stripmyspaces, mas não consigo fazer isso com strip():

>>> 'strip my spaces'.strip()
'strip my spaces'
nome de usuário errado
fonte
13
Observe que str.strip afeta apenas os espaços em branco à esquerda e à direita.

Respostas:

311

Aproveitando o comportamento do str.split sem o parâmetro sep:

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

Se você deseja apenas remover espaços em vez de todos os espaços em branco:

>>> s.replace(" ", "")
'\tfoo\nbar'

Otimização prematura

Mesmo que a eficiência não seja o objetivo principal - escrever código claro -, aqui estão alguns horários iniciais:

$ 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

Observe que o regex é armazenado em cache, portanto, não é tão lento quanto você imagina. Compilá-lo de antemão ajuda alguns, mas só importa na prática se você chamar isso muitas vezes:

$ 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

Embora o re.sub seja 11,3x mais lento, lembre-se de que seus gargalos estão garantidos em outros lugares. A maioria dos programas não notaria a diferença entre nenhuma dessas três opções.


fonte
Provavelmente é mais lento que a \s+substituição. Eu ficaria com re.
OTZ
@OTZ: Você pode se surpreender, mas veja a nota "lembrar".
@Roger Hmm. interessante. Você já tentou o s.translatemétodo por acaso? Provavelmente, supera todos os métodos mostrados nesta página.
OTZ
@Roger Pate: Você não precisa do argumento de 'mesa' para traduzir, pode ser None- embora, surpreendentemente, que o torna mais lento ...
martineau
1
Tente myString.translate(None, " \t\r\n\v"). Leva apenas 83% do tempo que a técnica mais rápida (dividir e unir) de Roger. Não tenho certeza se ele cobre todos os caracteres de espaço em branco que a divisão faz, mas provavelmente será suficiente para a maioria dos aplicativos ASCII.
Brianmearns 15/03/12
60
>>> import re
>>> re.sub(r'\s+', '', 'strip my spaces')
'stripmyspaces'

Também lida com caracteres em branco em que você não está pensando (acredite, há muitos).

Tim Yates
fonte
3
Esta é uma solução muito menos invasiva do que a resposta aceita.
John Smith
Isso é mais explícito do que as outras respostas, por isso é preciso o bolo para mim.
Tristan
34

Alternativamente,

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

E aqui está a versão do Python3:

"strip my spaces".translate(str.maketrans('', '', string.whitespace))
Dan Menes
fonte
isso parece o mais pitonico. por que não foi votado para o topo?
Rbp
O código Python 3 na resposta funciona. O comentário de @DanMenes is obsolete
igo
3
NameError: name 'string' is not defined.
Zelphir Kaltstahl
@ZelphirKaltstahl você precisaimport string
Shahryar Saljoughi
13

O mais simples é usar o replace:

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

Como alternativa, use uma expressão regular:

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

Remova os espaços iniciais em Python

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

Remover os espaços finais ou finais no Python

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

Remova os whiteSpaces do início e do fim da string em Python

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

Remova todos os espaços em python

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

Experimente uma regex com re.sub. Você pode procurar por todos os espaços em branco e substituir por uma sequência vazia.

\sno seu padrão corresponderá a caracteres de espaço em branco - e não apenas a um espaço (guias, novas linhas etc.). Você pode ler mais sobre isso no manual .

Matthew Iselin
fonte
Eu não sei como usar
regexes
@wrongusername: atualizado com um link para a página de manual do re-módulo.
Matthew Iselin
2
import re
re.sub(' ','','strip my spaces')
PrabhuPrakash
fonte
3
Bem-vindo ao SO. Apesar de agradecermos sua resposta, seria melhor se ela fornecesse valor adicional além das outras respostas. Nesse caso, sua resposta não fornece valor adicional, pois outro usuário já postou essa solução. Se uma resposta anterior foi útil para você, você deve votar quando tiver reputação suficiente #
Maximilian Peters
Isso não responde à pergunta "como remover todo o espaço em branco". Ele só remover espaços
Nick
2

Conforme mencionado por Roger Pate, o seguinte código funcionou para mim:

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

Estou usando o Jupyter Notebook para executar o seguinte 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
Yogesh
fonte
2

As técnicas convencionais para filtrar uma lista aplicar, embora eles não são tão eficientes quanto o split/joinou translatemétodos.

Precisamos de um conjunto de espaços em branco:

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

O filterbuiltin:

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

Uma compreensão da lista (sim, use os colchetes: veja a referência abaixo):

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

Uma dobra:

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

Referência:

>>> 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
jferard
fonte
0

TL / DR

Esta solução foi testada usando Python 3.6

Para remover todos os espaços de uma string no Python3, você pode usar a seguinte função:

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

Para remover qualquer caractere de espaço em branco ('\ t \ n \ r \ x0b \ x0c'), você pode usar a seguinte função:

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

Explicação

O str.translatemétodo Python é um método de classe interno de str, pega uma tabela e retorna uma cópia da string com cada caractere mapeado na tabela de conversão passada. Documentação completa para str.translate

Para criar a tabela de conversão str.maketransé usado. Este método é outro método de classe interno de str. Aqui, usamos apenas um parâmetro, neste caso, um dicionário, onde as chaves são os caracteres a serem substituídos, mapeados para valores com o valor de substituição de caracteres. Retorna uma tabela de conversão para uso com str.translate. Documentação completa para str.maketrans

O stringmódulo em python contém algumas operações e constantes de string comuns. string.whitespaceé uma constante que retorna uma sequência que contém todos os caracteres ASCII considerados em branco. Isso inclui os caracteres espaço, tabulação, avanço de linha, retorno, avanço de formulário e guia vertical. Documentação completa para string

Na segunda função dict.fromkeysé usada para criar um dicionário onde as chaves são os caracteres na string retornados por string.whitespacecada um com valor None. Documentação completa para dict.fromkeys

R. Arctor
fonte
0

Se o desempenho ideal não é um requisito e você quer apenas algo simples, você pode definir uma função básica para testar cada caractere usando o método "isspace" incorporado da classe de cadeia de caracteres:

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 a no_white_spacestring dessa maneira não terá desempenho ideal, mas a solução é fácil de entender.

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

Se você não deseja definir uma função, pode convertê-la em algo vagamente semelhante à compreensão da lista. Empréstimos da joinsolução da resposta principal :

>>> "".join([c for c in "strip my spaces" if not c.isspace()])
'stripmyspaces'
nBurn
fonte