Usuń wszystkie białe znaki z ciągu

787

Chcę wyeliminować wszystkie białe znaki z łańcucha, na obu końcach i między słowami.

Mam ten kod Python:

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

Ale to eliminuje tylko białe znaki po obu stronach łańcucha. Jak usunąć wszystkie białe znaki?

co2f2e
źródło
4
Jak powinien wyglądać twój wynik? hello apple? helloapple?
Mark Byers
4
@JachachPileborg, nie do końca tak myślę, ponieważ dotyczy to również zmniejszania białych znaków między słowami.
wal-o-mat
3
helloapple musi być moim wyjściem
co2f2e 11.02.13
8
Popraw mnie, jeśli się mylę, ale „białe znaki” nie są synonimem „znaków spacji”. Aktualna odpowiedź oznaczona jako poprawna nie usuwa wszystkich białych znaków . Ale skoro jest oznaczony jako poprawny, musiał odpowiedzieć na zamierzone pytanie? Więc powinniśmy edytować pytanie, aby odzwierciedlić przyjętą odpowiedź? @Kalanamith Czy chcesz zrobić wszystkie białe spacje lub tylko spacje?
AnnanFay,

Odpowiedzi:

1658

Jeśli chcesz usunąć spacje początkowe i końcowe, użyj str.strip():

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

Jeśli chcesz usunąć wszystkie znaki spacji, użyj str.replace():

(Uwaga: usuwa to tylko „normalny” znak spacji ASCII, ' ' U+0020ale nie powoduje żadnych innych białych znaków )

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

Jeśli chcesz usunąć zduplikowane spacje, użyj str.split():

sentence = ' hello  apple'
" ".join(sentence.split())
>>> 'hello apple'
Cédric Julien
źródło
42
Zaletą tej funkcji jest to, że usuwa również „\ r \ n” z pliku HTML otrzymanego od Beautiful Soup.
lsheng
27
Lubię „” .join (zdanie.split ()), to usuwa wszystkie białe spacje (spacje, tabulatory, znaki nowej linii) z dowolnego miejsca w zdaniu.
don
początkujący tutaj. Czy ktoś może mi wyjaśnić, dlaczego print (zdanie.join (zdanie.split ())) prowadzi do „hello hello appleapple”? Chcę tylko zrozumieć, w jaki sposób przetwarzany jest tutaj kod.
Yannis Dran
2
@YannisDran sprawdź dokumentację str.join () , kiedy zadzwonisz sentence.join(str_list), poprosisz pytona o połączenie elementów z str_list za pomocą sentenceseparatora.
Cédric Julien
1
"".join(sentence.split())jest rzeczywiście rozwiązaniem kanonicznym, skutecznie usuwającym wszystkie białe spacje, a nie tylko spacje. Mark Byers ' doskonała odpowiedź powinna prawdopodobnie zostały przyjęte w miejsce tego mniej obowiązującym odpowiedź.
Cecil Curry
263

Aby usunąć tylko spacje, użyj str.replace:

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

Aby usunąć wszystkie białe znaki (spacja, tabulator, znak nowej linii, i tak dalej), można użyć splitwtedy join:

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

lub wyrażenie regularne:

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

Jeśli chcesz usunąć tylko białe znaki od początku i na końcu, możesz użyć strip:

sentence = sentence.strip()

Możesz także użyć lstripdo usunięcia białych znaków tylko na początku łańcucha i rstripdo usunięcia białych znaków na końcu łańcucha.

Mark Byers
źródło
Uwaga: Nie musisz kompilować step, re.sub (i przyjaciele) buforują skompilowany wzór. Zobacz także odpowiedź Emila .
Andy Hayden
python3:yourstr.translate(str.maketrans('', '', ' \n\t\r'))
deed02392
104

Alternatywą jest użycie wyrażeń regularnych i dopasowanie również tych dziwnych białych znaków . Oto kilka przykładów:

Usuń WSZYSTKIE spacje w ciągu, nawet między słowami:

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

Usuń spacje w POCZĄTKU łańcucha:

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

Usuń spacje na końcu łańcucha:

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

Usuń spacje zarówno w POCZĄTKU, jak i KONIEC łańcucha:

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

Usuń TYLKO DUPLIKATOWANE spacje:

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

(Wszystkie przykłady działają zarówno w Pythonie 2, jak i Pythonie 3)

Emil Stenström
źródło
Nie działał dla „\ u202a1234 \ u202c”. Daje to samo wyjście: u '2 \ u202a1234 \ u202c'
Sarang
@ Sarang: To nie są białe znaki (google, a zobaczysz), ale „Ogólna interpunkcja”. Moja odpowiedź dotyczy tylko usuwania znaków sklasyfikowanych jako białe znaki.
Emil Stenström,
Jest to jedyne rozwiązanie, które widzę tutaj, które usuwa te cholernie nieznośne znaki białych znaków, dzięki fam
CapnShanty
41

Białe znaki obejmują spację, tabulatory i CRLF . Tak więc możemy użyć eleganckiej i jedno liniowej funkcji struny str.translate:

Python 3

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

LUB jeśli chcesz być dokładny:

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

Python 2

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

LUB jeśli chcesz być dokładny:

import string
' hello  apple'.translate(None, string.whitespace)
MaK
źródło
2
To nie pomoże w przypadku białych znaków Unicode, takich jak\xc2\xa0
Suzana,
5
ans.translate( None, string.whitespace )produkuje tylko builtins.TypeError: translate() takes exactly one argument (2 given)dla mnie. Docs mówi, że argument jest tabelą translacji, zobacz string.maketrans (). Ale patrz komentarz Amnona Harela poniżej.
user405
2
' hello apple'.translate(str.maketrans('', '', string.whitespace))Uwaga: lepiej zrobić zmienną do przechowywania tabeli trans, jeśli zamierzasz to zrobić wiele razy.
Shogan Aversa-Druesne,
16

Do usuwania białych znaków od początku i końca użyj strip.

>> "  foo bar   ".strip()
"foo bar"
wal-o-mat
źródło
1
Pytanie dotyczy w szczególności usunięcia wszystkich białych znaków, a nie tylko ich końców. Proszę zwróć uwagę.
Shayan Shafiq
9
' hello  \n\tapple'.translate({ord(c):None for c in ' \n\t\r'})

MaK wskazał już na powyższą metodę „tłumacz”. Ta odmiana działa z Pythonem 3 (zobacz to pytania i odpowiedzi ).

Amnon Harel
źródło
2
Dzięki! Lub xxx.translate( { ord(c) :None for c in string.whitespace } )dla dokładności.
user405
7

Bądź ostrożny:

strip wykonuje rstrip i lstrip (usuwa spacje początkowe i końcowe, tabulatory, powroty i kanały informacyjne, ale nie usuwa ich na środku łańcucha).

Jeśli zamienisz tylko spacje i tabulatory, możesz uzyskać ukryte listy CRLF, które wydają się pasować do tego, czego szukasz, ale nie są takie same.

yan bellavance
źródło
3
import re    
sentence = ' hello  apple'
re.sub(' ','',sentence) #helloworld (remove all spaces)
re.sub('  ',' ',sentence) #hello world (remove double spaces)
PrabhuPrakash
źródło
3
pytaniem było zbyt usunięcie całej białej spacji, która zawiera tabulatory i znaki nowej linii, ten fragment kodu usunie tylko zwykłe spacje.
Maximilian Peters
3

Ponadto pasek ma kilka odmian:

Usuń spacje w POCZĄTKU i KONIEC łańcucha:

sentence= sentence.strip()

Usuń spacje w POCZĄTKU łańcucha:

sentence = sentence.lstrip()

Usuń spacje na końcu łańcucha:

sentence= sentence.rstrip()

Wszystkie trzy funkcje łańcucha strip lstripi rstripmogą usuwać parametry łańcucha, przy czym domyślnie są to białe znaki. Może to być pomocne, gdy pracujesz z czymś szczególnym, na przykład możesz usunąć tylko spacje, ale nie znaki nowej linii:

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

Lub możesz usunąć dodatkowe przecinki podczas czytania na liście ciągów:

"1,2,3,".strip(",")
Ania
źródło
1

usuń wszystkie białe znaki z łańcucha, na obu końcach i między słowami.

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

Dokumenty Python:

uchwyt
źródło
Wiem, że rezostało już zasugerowane, ale stwierdziłem, że rzeczywista odpowiedź na tytuł pytania była nieco ukryta wśród wszystkich innych opcji.
obsłuż