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?


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'

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.


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)


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)

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"

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 ).


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.


3
import re    
sentence = ' hello  apple'
re.sub(' ','',sentence) #helloworld (remove all spaces)
re.sub('  ',' ',sentence) #hello world (remove double spaces)

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(",")

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:


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ż
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.