Як обрізати пробіли з рядка?


1155

Як я можу видалити провідні та кінцеві пробіли з рядка в Python?

Наприклад:

" Hello " --> "Hello"
" Hello"  --> "Hello"
"Hello "  --> "Hello"
"Bob has a cat" --> "Bob has a cat"

17
Це питання якраз змусив мене говорити з колегами з роботи про зачистку протягом 3 хвилин. Щоб хто-небудь ще приєднався на півдорозі, вони могли б подумати, що ми всі трохи працюємо нічними роботами.
Whitecat

Відповіді:


1735

Лише один пробіл чи всі послідовні пробіли? Якщо другий, то в рядках вже є .strip()метод:

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

Якщо вам потрібно лише видалити один пробіл, ви можете зробити це за допомогою:

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

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

Також зверніть увагу, що str.strip()видаляються й інші символи пробілу (наприклад, вкладки та нові рядки). Щоб видалити лише пробіли, ви можете вказати символ, який потрібно видалити як аргумент strip, тобто:

>>> "  Hello\n".strip(" ")
'Hello\n'

19
Якщо вам потрібна функція смужки, наприклад функція карти, ви можете отримати доступ до неї через str.strip (), як-от так map (str.strip, collection_of_s)
Уорд

1
Чи є спосіб обрізати білі простори на кінцях?
Ніхіл Гіррай

2
@killthrush Дякую за довідку, але я думаю, ви мали на увазі rstrip()функцію. :-)
Ніхіл Гіррай

14
Іноді я відчуваю , як пітон навмисно уникає добре прийнято і значущих імен , що переважна більшість мов використовує для того , щоб бути «унікальними» і «іншими» - stripзамість того trim, isinstanceзамість того , щоб instanceof, listзамість того array, і т.д., і т.д. Чому б просто не використовувати імена, з якими всі знайомі ?? geez: P
Гершом

3
@GershomMaes у такому stripвипадку я повністю згоден, але список абсолютно не відрізняється від масиву.
JFA

262

Як зазначено у відповідях вище

myString.strip()

видалить усі провідні та кінцеві символи пробілу, такі як \ n, \ r, \ t, \ f, пробіл.

Для більшої гнучкості використовуйте наступне

  • Вилучає лише провідні символи пробілів:myString.lstrip()
  • Видаляє тільки кінцеві пробільні символи:myString.rstrip()
  • Вилучає конкретні символи пробілів: myString.strip('\n')або myString.lstrip('\n\r')або myString.rstrip('\n\t')тощо.

Більш детальна інформація доступна в документах


я вважаю, що \ r \ n не \ n \ r ... (не можу редагувати публікацію - недостатньо символів змінено)
StefanNch

8
@StefanNch: Порядок символів зовсім не має значення. \ n \ r також видалить \ r \ n
Йоганнес Оверманн

122

strip не обмежується символами пробілу:

# remove all leading/trailing commas, periods and hyphens
title = title.strip(',.-')

54

Це видалить усі провідні та кінцеві пробіли в myString:

myString.strip()

3
У цій публікації є лише код, він не пояснює, що функція виконує. Чи вилучає пробіл пробілів чи пробілів або те і інше? Це видаляє просто пробіли чи всі види пробілів? Чи можете ви змусити його видаляти просто пробіли тоді, чи є інша функція для цього? Якщо він видаляє простір провідної та кінцевої пробілів, чи можете ви змусити його видалити лише одне з двох, чи є / чи є (і) інші функції, щоб виконувати цю роботу? myString.strip()відповіді не на одне із заданих мною питань.
EKons

8
Для справедливості, ОП спеціально попросив метод, який видаляє провідні та відсталі пробіли з рядка. Досить гарна відповідь мені
Деніс Лінс

21

Ви хочете, щоб смуга ():

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

for phrase in myphrases:
    print phrase.strip()

0

Я хотів видалити занадто багато пробілів у рядку (також між рядком, не тільки на початку чи в кінці). Я зробив це, бо не знаю, як це зробити інакше:

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)

Це замінює подвійні пробіли в одному просторі, поки у вас більше немає подвійних пробілів


Незважаючи на те, що це працює, це не дуже ефективно, використовуйте замість цього: stackoverflow.com/a/2077906/1240286
Arklur

0

Я не міг знайти рішення того, що шукав, тому створив деякі спеціальні функції. Ви можете спробувати їх.

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

0

Якщо ви хочете обрізати вказану кількість пробілів зліва та справа , ви можете зробити це:

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"


0

Як я можу видалити провідні та кінцеві пробіли з рядка в Python?

Отже нижче рішення видалить провідні та кінцеві пробіли, а також проміжні пробіли. Наприклад, якщо вам потрібно отримати чіткі рядкові значення без кількох пробілів.

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

Як ви бачите, це видалить усі кілька пробілів у рядку (вихідний Hello Worldдля всіх). Розташування не має значення. Але якщо вам справді потрібні провідні та кінцеві пробіли, тоді strip()знайдете.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.