Jak przyciąć białe znaki z łańcucha?

1155

Jak usunąć wiodące i końcowe białe znaki z łańcucha w Pythonie?

Na przykład:

" Hello " --> "Hello"
" Hello"  --> "Hello"
"Hello "  --> "Hello"
"Bob has a cat" --> "Bob has a cat"
Georgy
źródło
17
To pytanie sprawiło, że rozmawiałem z kolegami z pracy o rozbieraniu na 3 minuty. Każdy, kto dołączy do niego w połowie, pomyślałby, że wszyscy pracujemy trochę w nocy.
Whitecat

Odpowiedzi:

1734

Tylko jedna spacja, czy wszystkie kolejne spacje? Jeśli drugi, to łańcuchy mają już .strip()metodę:

>>> ' Hello '.strip()
'Hello'
>>> ' Hello'.strip()
'Hello'
>>> 'Bob has a cat'.strip()
'Bob has a cat'
>>> '   Hello   '.strip()  # ALL consecutive spaces at both ends removed
'Hello'

Jeśli jednak chcesz usunąć tylko jedno miejsce, możesz to zrobić za pomocą:

def strip_one_space(s):
    if s.endswith(" "): s = s[:-1]
    if s.startswith(" "): s = s[1:]
    return s

>>> strip_one_space("   Hello ")
'  Hello'

Pamiętaj też, że str.strip()usuwa również inne znaki spacji (np. Tabulatory i znaki nowej linii). Aby usunąć tylko spacje, możesz określić znak do usunięcia jako argument strip, tj .:

>>> "  Hello\n".strip(" ")
'Hello\n'
Brian
źródło
19
Jeśli potrzebujesz funkcji paska, na przykład funkcji mapy, możesz uzyskać do niej dostęp za pomocą str.strip (), podobnie jak map (str.strip, collection_of_s)
Ward
1
Czy istnieje sposób na przycięcie białych znaków na końcach?
Nikhil Girraj,
2
@killthrush Dzięki za odniesienie, ale myślę, że miałeś na myśli tę rstrip()funkcję. :-)
Nikhil Girraj
14
Czasami wydaje mi się, że python celowo unika dobrze przyjętych i znaczących nazw, których używa ogromna większość języków, aby być „unikatowymi” i „różnymi” - stripzamiast trim, isinstancezamiast instanceof, listzamiast array, itp. Itd. Dlaczego nie użyć imiona, które wszyscy znają ?? geez: P
Gershom
3
@GershomMaes w stripprzypadku całkowicie się zgadzam, ale lista jest zupełnie inna niż tablica.
JFA
262

Jak wskazano w odpowiedziach powyżej

myString.strip()

usunie wszystkie wiodące i końcowe znaki spacji, takie jak \ n, \ r, \ t, \ f, spacja.

Aby uzyskać większą elastyczność, skorzystaj z poniższych

  • Usuwa tylko wiodące znaki białych znaków:myString.lstrip()
  • Usuwa tylko końcowe znaki białych znaków:myString.rstrip()
  • Usuwa szczególnych znaków odstępu: myString.strip('\n')lub myString.lstrip('\n\r')lub myString.rstrip('\n\t')i tak dalej.

Więcej informacji jest dostępnych w dokumentach

Mudit Jain
źródło
wierzę, że nie jest \ r \ n nie \ n \ r ... (nie można edytować postu - zmodyfikowano za mało znaków)
StefanNch
8
@StefanNch: Kolejność znaków w ogóle nie ma znaczenia. \ n \ r usunie także \ r \ n.
Johannes Overmann
122

strip nie ogranicza się do białych znaków:

# remove all leading/trailing commas, periods and hyphens
title = title.strip(',.-')
Drew Noakes
źródło
54

Spowoduje to usunięcie wszystkich wiodących i końcowych białych znaków w myString:

myString.strip()
Deniz Dogan
źródło
3
Ten post ma tylko kod, nie wyjaśnia, co robi funkcja. Czy usuwa wiodące lub końcowe białe spacje, czy jedno i drugie? Czy usuwa tylko spacje lub wszelkiego rodzaju białe znaki? Czy możesz więc usunąć tylko spacje, czy może jest inna funkcja? Jeśli usuwa zarówno początkowe, jak i końcowe białe spacje, czy możesz sprawić, że usunie tylko jedną z dwóch, czy też jest / czy istnieją inne funkcje do wykonania zadania? myString.strip()nie odpowiada na żadne z zadanych przeze mnie pytań.
EKons,
8
Aby być uczciwym, OP specjalnie poprosił o metodę, która usuwa wiodące i końcowe białe znaki z łańcucha. Wystarczająco dobra odpowiedź dla mnie
Denis Lins,
21

Chcesz strip ():

myphrases = [ " Hello ", " Hello", "Hello ", "Bob has a cat" ]

for phrase in myphrases:
    print phrase.strip()
vezult
źródło
0

Chciałem usunąć zbyt wiele spacji w ciągu znaków (również między ciągami, nie tylko na początku lub na końcu). Zrobiłem to, ponieważ nie wiem, jak to zrobić inaczej:

string = "Name : David         Account: 1234             Another thing: something  " 

ready = False
while ready == False:
    pos = string.find("  ")
    if pos != -1:
       string = string.replace("  "," ")
    else:
       ready = True
print(string)

Zastępuje to podwójne spacje w jednym miejscu, dopóki nie będzie już żadnych spacji

Marjan
źródło
Chociaż to działa, nie jest bardzo wydajne, użyj tego zamiast tego: stackoverflow.com/a/2077906/1240286
Arklur
0

Nie mogłem znaleźć rozwiązania tego, czego szukałem, więc stworzyłem niestandardowe funkcje. Możesz je wypróbować.

def cleansed(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    # return trimmed(s.replace('"', '').replace("'", ""))
    return trimmed(s)


def trimmed(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    ss = trim_start_and_end(s).replace('  ', ' ')
    while '  ' in ss:
        ss = ss.replace('  ', ' ')
    return ss


def trim_start_and_end(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    return trim_start(trim_end(s))


def trim_start(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    chars = []
    for c in s:
        if c is not ' ' or len(chars) > 0:
            chars.append(c)
    return "".join(chars).lower()


def trim_end(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    chars = []
    for c in reversed(s):
        if c is not ' ' or len(chars) > 0:
            chars.append(c)
    return "".join(reversed(chars)).lower()


s1 = '  b Beer '
s2 = 'Beer  b    '
s3 = '      Beer  b    '
s4 = '  bread butter    Beer  b    '

cdd = trim_start(s1)
cddd = trim_end(s2)
clean1 = cleansed(s3)
clean2 = cleansed(s4)

print("\nStr: {0} Len: {1} Cleansed: {2} Len: {3}".format(s1, len(s1), cdd, len(cdd)))
print("\nStr: {0} Len: {1} Cleansed: {2} Len: {3}".format(s2, len(s2), cddd, len(cddd)))
print("\nStr: {0} Len: {1} Cleansed: {2} Len: {3}".format(s3, len(s3), clean1, len(clean1)))
print("\nStr: {0} Len: {1} Cleansed: {2} Len: {3}".format(s4, len(s4), clean2, len(clean2)))
Mitch
źródło
0

Jeśli chcesz przyciąć określoną liczbę spacji z lewej i prawej strony , możesz to zrobić:

def remove_outer_spaces(text, num_of_leading, num_of_trailing):
    text = list(text)
    for i in range(num_of_leading):
        if text[i] == " ":
            text[i] = ""
        else:
            break

    for i in range(1, num_of_trailing+1):
        if text[-i] == " ":
            text[-i] = ""
        else:
            break
    return ''.join(text)

txt1 = "   MY name is     "
print(remove_outer_spaces(txt1, 1, 1))  # result is: "  MY name is    "
print(remove_outer_spaces(txt1, 2, 3))  # result is: " MY name is  "
print(remove_outer_spaces(txt1, 6, 8))  # result is: "MY name is"
Dounchan
źródło
0

Można to również zrobić za pomocą wyrażenia regularnego

import re

input  = " Hello "
output = re.sub(r'^\s+|\s+$', '', input)
# output = 'Hello'
James McGuigan
źródło
0

Jak usunąć wiodące i końcowe białe znaki z łańcucha w Pythonie?

Dlatego poniższe rozwiązanie usunie wiodące i końcowe białe spacje, a także pośrednie białe spacje. Na przykład, jeśli chcesz uzyskać czyste wartości ciągu bez wielu białych znaków.

>>> str_1 = '     Hello World'
>>> print(' '.join(str_1.split()))
Hello World
>>>
>>>
>>> str_2 = '     Hello      World'
>>> print(' '.join(str_2.split()))
Hello World
>>>
>>>
>>> str_3 = 'Hello World     '
>>> print(' '.join(str_3.split()))
Hello World
>>>
>>>
>>> str_4 = 'Hello      World     '
>>> print(' '.join(str_4.split()))
Hello World
>>>
>>>
>>> str_5 = '     Hello World     '
>>> print(' '.join(str_5.split()))
Hello World
>>>
>>>
>>> str_6 = '     Hello      World     '
>>> print(' '.join(str_6.split()))
Hello World
>>>
>>>
>>> str_7 = 'Hello World'
>>> print(' '.join(str_7.split()))
Hello World

Jak widać, spowoduje to usunięcie wielu białych znaków w ciągu (dane wyjściowe są Hello Worlddla wszystkich). Lokalizacja nie ma znaczenia. Ale jeśli naprawdę potrzebujesz wiodących i końcowych białych znaków, to strip()znajdziesz.

Kushan Gunasekera
źródło