Remova todo o espaço em branco em uma sequência

788

Eu quero eliminar todo o espaço em branco de uma string, nas duas extremidades e entre as palavras.

Eu tenho esse código Python:

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

Mas isso apenas elimina o espaço em branco nos dois lados da string. Como removo todo o espaço em branco?

co2f2e
fonte
4
Como deve ser o seu resultado? hello apple? helloapple?
Mark Byers
4
@JoachimPileborg, não exatamente, eu acho, porque também se trata de um espaço em branco reduzido entre as palavras.
wal-o-mat
3
helloapple precisa ser a minha saída
co2f2e
8
Corrija-me se estiver errado, mas "espaço em branco" não é sinônimo de "caracteres de espaço". A resposta atual marcada como correta não remove todos os espaços em branco . Mas, como está marcado como correto, deve ter respondido à pergunta pretendida? Então, devemos editar a pergunta para refletir a resposta aceita? @Kalanamith Deseja, ou deseja remover todos os espaços em branco ou apenas espaços?
AnnanFay

Respostas:

1659

Se você deseja remover os espaços iniciais e finais, use str.strip():

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

Se você deseja remover todos os caracteres de espaço, use str.replace():

(Nota: isso remove apenas o caractere de espaço ASCII "normal", ' ' U+0020mas não qualquer outro espaço em branco )

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

Se você deseja remover espaços duplicados, use str.split():

sentence = ' hello  apple'
" ".join(sentence.split())
>>> 'hello apple'
Cédric Julien
fonte
42
A grandeza dessa função é que ela também remove o '\ r \ n' do arquivo html que recebi da Beautiful Soup.
Lsheng 26/05
27
Eu gosto de "" .join (frase.split ()), isso remove todos os espaços em branco (espaços, tabulações, novas linhas) de qualquer lugar da frase.
don
iniciante aqui. Alguém pode me explicar por que print (sentença.join (sentença.split ())) resulta como 'olá, olá, appleapple'? Só quero entender como o código é processado aqui.
Yannis Dran
2
@YannisDran verifique a documentação str.join () , quando você chama sentence.join(str_list)o python para juntar itens do str_list com sentencecomo separador.
Cédric Julien
1
"".join(sentence.split())é de fato a solução canônica, removendo com eficiência todo o espaço em branco, e não apenas os espaços. Mark ByersA excelente resposta de provavelmente deveria ter sido aceita em vez dessa resposta menos aplicável.
Cecil Curry
263

Para remover apenas espaços, use str.replace:

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

Para remover todos os caracteres em branco (espaço, tabulação, nova linha, e assim por diante) você pode usar splitem seguida join:

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

ou uma expressão regular:

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

Se você deseja remover apenas os espaços em branco do começo e do fim, use strip:

sentence = sentence.strip()

Você também pode usar lstrippara remover o espaço em branco somente do início da string e rstrippara remover o espaço em branco do final da string.

Mark Byers
fonte
Nota: Você não precisa compilar a etapa, re.sub (e amigos) armazena em cache o padrão compilado. Veja também, a resposta de Emil .
Andy Hayden
python3:yourstr.translate(str.maketrans('', '', ' \n\t\r'))
deed02392 17/04/19
104

Uma alternativa é usar expressões regulares e combinar esses caracteres estranhos em espaço em branco . aqui estão alguns exemplos:

Remova TODOS os espaços de uma string, mesmo entre as palavras:

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

Remova os espaços no início de uma sequência:

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

Remova os espaços no FIM de uma sequência:

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

Remova os espaços no BEGINNING e no END de uma string:

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

Remova os espaços ONLY DUPLICATE:

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

(Todos os exemplos funcionam em Python 2 e Python 3)

Emil Stenström
fonte
Não funcionou para "\ u202a1234 \ u202c". Dá a mesma saída: u '\ u202a1234 \ u202c'
Sarang
@ Sarang: Esses não são caracteres de espaço em branco (pesquise neles e você verá), mas "Pontuação geral". Minha resposta trata apenas da remoção de caracteres classificados como espaço em branco.
Emil Stenström
Esta é a única solução que vejo aqui que remove os maldito traquina unicode caracteres em branco, graças fam
CapnShanty
41

O espaço em branco inclui espaço, guias e CRLF . Portanto, uma função de string elegante e de uma linha que podemos usar éstr.translate :

Python 3

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

OU se você quiser ser completo:

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

Python 2

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

OU se você quiser ser completo:

import string
' hello  apple'.translate(None, string.whitespace)
MaK
fonte
2
Isto não ajuda com Unicode espaços em branco como\xc2\xa0
Suzana
5
ans.translate( None, string.whitespace )produz apenas builtins.TypeError: translate() takes exactly one argument (2 given)para mim. O Docs diz que o argumento é uma tabela de conversão, consulte string.maketrans (). Mas veja o comentário de Amnon Harel, abaixo.
user405
2
' hello apple'.translate(str.maketrans('', '', string.whitespace))Nota: é melhor criar uma variável para armazenar a tabela, se você pretende fazer isso várias vezes.
Shogan Aversa-Druesne
16

Para remover os espaços em branco do começo e do fim, use strip.

>> "  foo bar   ".strip()
"foo bar"
wal-o-mat
fonte
1
A pergunta pede especificamente a remoção de todo o espaço em branco e não apenas nas extremidades. Por favor, tome nota.
Shayan Shafiq 04/03
9
' hello  \n\tapple'.translate({ord(c):None for c in ' \n\t\r'})

MaK já apontou o método "translate" acima. E essa variação funciona com o Python 3 (consulte as perguntas e respostas ).

Amnon Harel
fonte
2
Obrigado! Ou, xxx.translate( { ord(c) :None for c in string.whitespace } )para mais detalhes.
user405
7

Seja cuidadoso:

strip faz um rstrip e lstrip (remove espaços iniciais e finais, tabulações, retornos e feeds de formulário, mas não os remove no meio da sequência).

Se você substituir apenas espaços e guias, poderá acabar com CRLFs ocultos que parecem corresponder ao que você está procurando, mas não são os mesmos.

yan bellavance
fonte
3
import re    
sentence = ' hello  apple'
re.sub(' ','',sentence) #helloworld (remove all spaces)
re.sub('  ',' ',sentence) #hello world (remove double spaces)
PrabhuPrakash
fonte
3
Se a pergunta também foi remover todos os espaços em branco, que incluem tabulações e novos caracteres de linha, esse trecho removerá apenas espaços regulares.
Maximilian Peters
3

Além disso, a tira tem algumas variações:

Remova espaços no BEGINNING e END de uma string:

sentence= sentence.strip()

Remova os espaços no início de uma sequência:

sentence = sentence.lstrip()

Remova os espaços no FIM de uma sequência:

sentence= sentence.rstrip()

Todas as três funções de sequência strip lstripe rstrippodem levar os parâmetros da sequência a serem removidos, com o padrão sendo todo o espaço em branco. Isso pode ser útil quando você estiver trabalhando com algo específico, por exemplo, você pode remover apenas espaços, mas não novas linhas:

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

Ou você pode remover vírgulas extras ao ler em uma lista de cadeias:

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

elimine todo o espaço em branco de uma string, nas duas extremidades e entre as palavras.

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

Documentos do Python:

lidar com
fonte
Sei que rejá foi sugerido antes, mas descobri que a resposta real ao título da pergunta estava um pouco escondida entre todas as outras opções.
manipula