Jak usunąć wszystkie białe znaki z łańcucha


179

Jak usunąć wszystkie spacje w ciągu znaków Pythona? Na przykład chcę, aby struna podobna była strip my spacesdo przekształcenia stripmyspaces, ale nie mogę tego osiągnąć za pomocą strip():

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

13
Zauważ, że str.strip ma wpływ tylko na początkowe i końcowe spacje.

Odpowiedzi:


311

Wykorzystując zachowanie str.split bez parametru sep:

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

Jeśli chcesz tylko usunąć spacje zamiast wszystkich białych znaków:

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

Przedwczesna optymalizacja

Chociaż wydajność nie jest głównym celem - pisanie przejrzystego kodu jest - oto kilka początkowych terminów:

$ 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

Zwróć uwagę, że wyrażenie regularne jest buforowane, więc nie jest tak wolne, jak można by sobie wyobrazić. Skompilowanie go wcześniej pomaga niektórym, ale w praktyce będzie miało znaczenie tylko wtedy, gdy wywołasz to wiele razy:

$ 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

Mimo że re.sub jest 11,3 razy wolniejsze, pamiętaj, że wąskie gardła są z pewnością gdzie indziej. Większość programów nie zauważyłaby różnicy między którąkolwiek z tych 3 opcji.


Prawdopodobnie wolniej niż \s+podstawienie. Trzymałbym się ponownie.
OTZ,

@OTZ: Możesz być zaskoczony, ale zobacz notatkę „Pamiętaj”.

@Roger Hmm. ciekawy. Czy próbowałeś tej s.translatemetody przez przypadek? Prawdopodobnie przebija wszystkie metody pokazane na tej stronie.
OTZ,

@Roger Pate: Nie potrzebujesz argumentu 'table' do translacji, może to być None- chociaż, co zaskakujące, powoduje to wolniejsze ...
martineau

1
Spróbuj myString.translate(None, " \t\r\n\v"). Zajmuje to tylko 83% w przypadku najszybszej techniki Rogera (rozdziel i dołącz). Nie jestem pewien, czy obejmuje wszystkie białe znaki, które się rozdzielają, ale prawdopodobnie wystarczy dla większości aplikacji ASCII.
brianmearns

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

Obsługuje również wszystkie białe znaki, o których nie myślisz (wierz mi, jest ich mnóstwo).


3
Jest to o wiele mniej skomplikowane rozwiązanie niż zaakceptowana odpowiedź.
John Smith

Jest to bardziej wyraźne niż inne odpowiedzi, więc dla mnie to ciasto.
Tristan

34

Alternatywnie,

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

A oto wersja Pythona3:

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

wydaje się to najbardziej pytoniczne. dlaczego nie został on przyjęty na szczyt?
rbp

Kod Pythona 3 w odpowiedzi działa. Komentarz od @DanMenes jest przestarzały
igo

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

@ZelphirKaltstahl you need toimport string
Shahryar Saljoughi

13

Najprościej jest użyć zamiany:

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

Alternatywnie użyj wyrażenia regularnego:

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

10

Usuń spacje początkowe w Pythonie

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

Usuń końcowe lub końcowe spacje w Pythonie

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

Usuń białe spacje z początku i końca ciągu w Pythonie

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

Usuń wszystkie spacje w Pythonie

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

3

Wypróbuj wyrażenie regularne z re.sub. Możesz wyszukać wszystkie białe znaki i zastąpić je pustym ciągiem.

\sw twoim wzorcu dopasują białe znaki - a nie tylko spacje (tabulatory, nowe linie itp.). Więcej na ten temat przeczytasz w instrukcji .


Nie wiem, jak używać
wyrażeń regularnych

@wrongusername: zaktualizowano za pomocą łącza do strony podręcznika modułu re.
Matthew Iselin

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

3
Witamy w SO. Chociaż dziękujemy Ci za odpowiedź, byłoby lepiej, gdyby oprócz innych odpowiedzi dostarczyła ona dodatkowej wartości. W takim przypadku Twoja odpowiedź nie zapewnia dodatkowej wartości, ponieważ inny użytkownik opublikował już to rozwiązanie. Jeśli poprzednia odpowiedź była dla Ciebie pomocna, zagłosuj na nią, gdy będziesz mieć wystarczającą reputację
Maximilian Peters,

To nie odpowiada na pytanie „jak usunąć wszystkie białe znaki”. Usuwa tylko spacje
Nick

2

Jak wspomniał Roger Pate, zadziałał dla mnie następujący kod:

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

Używam Notatnika Jupyter do uruchomienia następującego kodu:

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

Stosowane są standardowe techniki filtrowania listy, chociaż nie są one tak wydajne jak metody split/joinlub translate.

Potrzebujemy zestawu białych znaków:

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

filterWbudowane:

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

Zrozumienie listy (tak, użyj nawiasów: patrz punkt odniesienia poniżej):

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

Krotnie:

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

Reper:

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

To rozwiązanie zostało przetestowane przy użyciu Pythona 3.6

Aby usunąć wszystkie spacje z ciągu w Pythonie3, możesz użyć następującej funkcji:

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

Aby usunąć wszelkie białe znaki ('\ t \ n \ r \ x0b \ x0c'), możesz użyć następującej funkcji:

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

Wyjaśnienie

str.translateMetoda Pythona jest wbudowaną metodą klasową str, pobiera tabelę i zwraca kopię ciągu z każdym znakiem odwzorowanym w przekazanej tabeli translacji. Pełna dokumentacja dla str.translate

Do stworzenia tabeli tłumaczeń str.maketranssłuży. Ta metoda jest kolejną wbudowaną metodą klasy str. Tutaj używamy go tylko z jednym parametrem, w tym przypadku ze słownikiem, w którym klucze to znaki, które mają być zastąpione, odwzorowane na wartości z wartością zastępującą znaki. Zwraca tabelę tłumaczeń do użycia z str.translate. Pełna dokumentacja dla str.maketrans

stringModuł w Pythonie zawiera kilka wspólnych operacji łańcuchowych i stałe. string.whitespacejest stałą, która zwraca łańcuch zawierający wszystkie znaki ASCII, które są uważane za białe znaki. Obejmuje to spację znaków, tabulator, wysuw wiersza, powrót, wysuw formularza i tabulator pionowy. Pełna dokumentacja dla stringów

W drugiej funkcji dict.fromkeyssłuży do tworzenia słownika, w którym kluczami są znaki w ciągu zwracane przez string.whitespacekażdy z wartością None. Pełna dokumentacja dla dict.fromkeys


0

Jeśli optymalna wydajność nie jest wymagana, a po prostu chcesz czegoś martwego prostego, możesz zdefiniować podstawową funkcję do testowania każdego znaku za pomocą wbudowanej metody "isspace" klasy string:

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

Budowanie no_white_spacestruny w ten sposób nie zapewni idealnej wydajności, ale rozwiązanie jest łatwe do zrozumienia.

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

Jeśli nie chcesz definiować funkcji, możesz przekonwertować ją na coś nieco podobnego za pomocą rozumienia list. Pożyczanie z rozwiązania u góry odpowiedzi join:

>>> "".join([c for c in "strip my spaces" if not c.isspace()])
'stripmyspaces'
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.