Удалить все пробелы в строке

790

Я хочу исключить все пробелы из строки, на обоих концах и между словами.

У меня есть этот код Python:

def my_handle(self):
    sentence = ' hello  apple  '
    sentence.strip()

Но это только устраняет пробелы с обеих сторон строки. Как мне удалить все пробелы?

co2f2e
источник
4
Как должен выглядеть ваш результат? hello apple? helloapple?
Марк Байерс
4
@JoachimPileborg, не совсем, я думаю, потому что это также о сокращении пробелов между словами.
wal-o-mat
3
helloapple должен быть моим выходом
co2f2e
8
Поправьте меня, если не прав, но «пробел» не является синонимом «пробела». Текущий ответ, помеченный как правильный, не удаляет все пробелы . Но, поскольку он помечен как правильный, он, должно быть, ответил на заданный вопрос? Таким образом, мы должны отредактировать вопрос, чтобы отразить принятый ответ? @ Kalanamith Вы хотели или хотите удалить все пробелы или только пробелы?
AnnanFay

Ответы:

1662

Если вы хотите удалить начальные и конечные пробелы, используйте str.strip():

sentence = ' hello  apple'
sentence.strip()
>>> 'hello  apple'

Если вы хотите удалить все пробелы, используйте str.replace():

(NB это только удаляет «нормальный» символ пробела ASCII, ' ' U+0020но не любой другой пробел )

sentence = ' hello  apple'
sentence.replace(" ", "")
>>> 'helloapple'

Если вы хотите удалить дублирующиеся пробелы, используйте str.split():

sentence = ' hello  apple'
" ".join(sentence.split())
>>> 'hello apple'
Седрик Жюльен
источник
42
Преимущество этой функции в том, что она также удаляет '\ r \ n' из html-файла, который я получил от Beautiful Soup.
Ишенг
27
Мне нравится "" .join (суждение.split ()), это удаляет все пробелы (пробелы, табуляции, новые строки) из любого места в предложении.
Дон
начинающий здесь. Может ли кто-нибудь объяснить мне, почему print (суждение.join (суждение.split ())) приводит к «привет привет яблоко»? Просто хочу понять, как код обрабатывается здесь.
Яннис Дран
2
@YannisDran проверяет документацию str.join () , когда вы звоните, sentence.join(str_list)вы просите python объединить элементы из str_list с sentenceразделителем.
Седрик Жюльен,
1
"".join(sentence.split())действительно является каноническим решением, эффективно удаляющим все пробелы, а не просто пробелы. Пометить Байерс " отличный ответ , вероятно, был принят вместо этого менее применимого ответа.
Сесил Карри
263

Чтобы удалить только пробелы, используйте str.replace:

sentence = sentence.replace(' ', '')

Для того, чтобы удалить все символы пробела (пробел, табуляция, перевод строки, и так далее) , вы можете использовать splitто join:

sentence = ''.join(sentence.split())

или регулярное выражение:

import re
pattern = re.compile(r'\s+')
sentence = re.sub(pattern, '', sentence)

Если вы хотите удалить только пробелы с начала и до конца, вы можете использовать strip:

sentence = sentence.strip()

Вы также можете использовать lstripдля удаления пробелов только из начала строки, а также rstripдля удаления пробелов из конца строки.

Марк Байерс
источник
Примечание. Вам не нужно компилировать шаг, повторно (и друзья) кэшировать скомпилированный шаблон. Смотрите также ответ Эмиля .
Энди Хейден
python3:yourstr.translate(str.maketrans('', '', ' \n\t\r'))
deed02392
104

Альтернативой является использование регулярных выражений и сопоставление этих странных пробелов . Вот некоторые примеры:

Удалить ВСЕ пробелы в строке, даже между словами:

import re
sentence = re.sub(r"\s+", "", sentence, flags=re.UNICODE)

Удалите пробелы в начале строки:

import re
sentence = re.sub(r"^\s+", "", sentence, flags=re.UNICODE)

Удалить пробелы в конце строки:

import re
sentence = re.sub(r"\s+$", "", sentence, flags=re.UNICODE)

Удалите пробелы как в начале, так и в конце строки:

import re
sentence = re.sub("^\s+|\s+$", "", sentence, flags=re.UNICODE)

Удалить ТОЛЬКО ДУБЛИРОВАННЫЕ пробелы:

import re
sentence = " ".join(re.split("\s+", sentence, flags=re.UNICODE))

(Все примеры работают как в Python 2, так и в Python 3)

Эмиль Стенстрём
источник
Не работал для "\ u202a1234 \ u202c". Дает тот же результат: и '\ u202a1234 \ u202c'
Sarang
@Sarang: Это не пробельные символы (гугл их, и вы увидите), а "Общая пунктуация". Мой ответ касается только удаления символов, классифицированных как пробелы.
Эмиль Стенстрём
Это единственное решение, которое я вижу здесь, которое удаляет этих чертовски надоедливых символов пробела
Юникода
41

Пробел включает в себя пробел, вкладки и CRLF . Итак, элегантная и однострочная строковая функция, которую мы можем использовать str.translate:

Python 3

' hello  apple'..translate(str.maketrans('', '', ' \n\t\r'))

ИЛИ если вы хотите быть тщательным:

import string
' hello  apple'..translate(str.maketrans('', '', string.whitespace))

Python 2

' hello  apple'.translate(None, ' \n\t\r')

ИЛИ если вы хотите быть тщательным:

import string
' hello  apple'.translate(None, string.whitespace)
МаК
источник
2
Это не поможет с пробелами Unicode, такими как\xc2\xa0
Suzana
5
ans.translate( None, string.whitespace )производит только builtins.TypeError: translate() takes exactly one argument (2 given)для меня. Документы говорят, что аргумент является таблицей перевода, см. String.maketrans (). Но см. Комментарий Амнона Харела ниже.
user405
2
' hello apple'.translate(str.maketrans('', '', string.whitespace))Примечание: лучше создать переменную для хранения таблицы, если вы собираетесь делать это несколько раз.
Шоган Аверса-Дрюсне
16

Для удаления пробелов из начала и конца используйте strip.

>> "  foo bar   ".strip()
"foo bar"
вали-O-MAT
источник
1
Вопрос, в частности, требует удаления всех пробелов, а не только на концах. Пожалуйста, обратите внимание.
Шаян Шафик
9
' hello  \n\tapple'.translate({ord(c):None for c in ' \n\t\r'})

МаК уже указывал на метод «перевода» выше. И этот вариант работает с Python 3 (см. Этот раздел вопросов и ответов ).

Амнон Харел
источник
2
Спасибо! Или xxx.translate( { ord(c) :None for c in string.whitespace } )для тщательности.
user405
7

Быть осторожен:

strip выполняет команды rstrip и lstrip (удаляет начальные и конечные пробелы, символы табуляции, возвраты и каналы, но не удаляет их в середине строки).

Если вы заменяете только пробелы и табуляции, вы можете получить скрытые CRLF, которые выглядят так, как вы ищете, но не совпадают.

Ян Беллаванс
источник
3
import re    
sentence = ' hello  apple'
re.sub(' ','',sentence) #helloworld (remove all spaces)
re.sub('  ',' ',sentence) #hello world (remove double spaces)
PrabhuPrakash
источник
3
вопрос был слишком убрать все пробелы, которые включают в себя символы табуляции и новой строки, этот фрагмент будет удалять только обычные пробелы.
Максимилиан Питерс
3

Кроме того, полоса имеет несколько вариаций:

Удалите пробелы в начале и в конце строки:

sentence= sentence.strip()

Удалите пробелы в начале строки:

sentence = sentence.lstrip()

Удалить пробелы в конце строки:

sentence= sentence.rstrip()

Все три строковые функции strip lstrip, и rstripможет принимать параметры строки в полосе, с по умолчанию не все белое пространство. Это может быть полезно, когда вы работаете с чем-то конкретным, например, вы можете удалить только пробелы, но не переводы строк:

" 1. Step 1\n".strip(" ")

Или вы можете удалить лишние запятые при чтении в списке строк:

"1,2,3,".strip(",")
Анна
источник
1

Устранить все пробелы в строке, на обоих концах и между словами.

>>> import re
>>> re.sub("\s+", # one or more repetition of whitespace
    '', # replace with empty string (->remove)
    ''' hello
...    apple
... ''')
'helloapple'

Документы Python:

ручка
источник
Я знаю re, что предлагалось ранее, но я обнаружил, что фактический ответ на заголовок вопроса был немного скрыт среди всех других вариантов.
справиться