Как мне вырезать пробел из строки?


1159

Как удалить начальные и конечные пробелы из строки в Python?

Например:

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

17
Этот вопрос только что заставил меня говорить с коллегами с работы о раздевании в течение 3 минут. Любой, кто присоединится к нему на полпути, подумал бы, что мы все немного работаем по ночам.
Whitecat

Ответы:


1739

Всего один пробел или все подряд пробелы? Если второе, то у строк уже есть .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)
Ward

1
Есть ли способ обрезать только пробелы на концах?
Нихил Гиррадж

2
@killthrush Спасибо за ссылку, но я думаю, что вы имели в виду rstrip()функцию. :-)
Nikhil Girraj

14
Иногда я чувствую, что python намеренно избегает общепринятых и значимых имен, которые подавляющее большинство языков используют для того, чтобы быть «уникальными» и «разными» - stripвместо trim, isinstanceвместо instanceof, listвместо arrayи т. Д. И т. Д. Почему бы просто не использовать имена, с которыми все знакомы ?? Боже: 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
Чтобы быть справедливым, OP специально попросил метод, который удаляет начальные и конечные пробелы из строки. Достаточно хороший ответ для меня
Денис Линс

21

Вы хотите strip ():

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

Это также можно сделать с помощью регулярного выражения

import re

input  = " Hello "
output = re.sub(r'^\s+|\s+$', '', input)
# output = 'Hello'

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.