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

Как удалить все пробелы в строке Python? Например, я хочу, чтобы строка типа strip my spaces была преобразована в stripmyspaces, но я не могу этого добиться с помощью strip():

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

person wrongusername    schedule 18.09.2010    source источник
comment
Обратите внимание, что str.strip влияет только на начальные и конечные пробелы.   -  person    schedule 18.09.2010
comment
..и он не заботится о де-факто пробелах Unicode, в отличие от пробелов нулевой ширины. Подробнее см. stackoverflow.com/a/3739928/2693875.   -  person Greg Dubicki    schedule 04.09.2020


Ответы (11)


Воспользовавшись поведением str.split без параметра sep:

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

Если вы просто хотите удалить пробелы вместо всех пробелов:

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

Преждевременная оптимизация

Несмотря на то, что эффективность не является главной целью - написание понятного кода - вот некоторые начальные сроки:

$ 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

Обратите внимание, что регулярное выражение кешируется, поэтому оно не такое медленное, как вы думаете. Его предварительная компиляция некоторым помогает, но на практике будет иметь значение, только если вы вызовете это много раз:

$ 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

Несмотря на то, что re.sub в 11,3 раза медленнее, помните, что ваши узкие места наверняка где-то еще. Большинство программ не заметят разницы между любым из этих трех вариантов.

person Community    schedule 18.09.2010
comment
Вероятно, это медленнее, чем замена \s+. Я бы придерживался ре. - person OTZ; 18.09.2010
comment
@OTZ: Вы можете быть удивлены, но посмотрите записку. - person ; 18.09.2010
comment
@ Роджер Хм. интересный. Вы случайно не пробовали метод s.translate? Вероятно, это превосходит все методы, представленные на этой странице. - person OTZ; 18.09.2010
comment
@Roger Pate: Вам не нужен аргумент table для перевода, это может быть None - хотя, как ни странно, это замедляет его ... - person martineau; 18.09.2010
comment
Еще кое-что. Передача в качестве второго аргумента для translate не удаляет все формы пробелов. - person martineau; 18.09.2010
comment
@martineau: Спасибо; help (str.translate) соврал мне! (Он говорит, что таблица должна быть строкой длиной 256.) Я просто удалю этот раздел; исправлять различные проблемы не стоит. (Всем любопытным: проверьте историю изменений.) - person ; 18.09.2010
comment
Попробуйте myString.translate(None, " \t\r\n\v"). Это занимает всего 83% от самой быстрой техники Роджера (разделение и соединение). Не уверен, что он охватывает все символы пробела, которые делает разделение, но, вероятно, этого будет достаточно для большинства приложений ASCII. - person brianmearns; 15.03.2012
comment
Это не работает со всеми струнами. Попробуйте запустить это в """http://myserver.com/api/interpreter?data=[out:json][timeout:25]; ( way["building"="house"](40,-74,40,-74); ); out body; >; out skel qt;""" Комментарий EDIT, похоже, не поддерживает пробелы = ( - person Tommy; 27.03.2018
comment
Я не знал, что .split () будет ловить любые пробелы, и держу пари, что следующий человек, читающий мой код, тоже не узнает об этом (включая меня в будущем через шесть месяцев). - person Tristan; 13.02.2019

Для Python 3:

>>> import re
>>> re.sub(r'\s+', '', 'strip my \n\t\r ASCII and \u00A0 \u2003 Unicode spaces')
'stripmyASCIIandUnicodespaces'
>>> # Or, depending on the situation:
>>> re.sub(r'(\s|\u180B|\u200B|\u200C|\u200D|\u2060|\uFEFF)+', '', \
... '\uFEFF\t\t\t strip all \u000A kinds of \u200B whitespace \n')
'stripallkindsofwhitespace'

... обрабатывает любые пробельные символы, о которых вы не думаете - и поверьте нам, их много.

\s сам по себе всегда закрывает пробелы ASCII:

  • (обычное) пространство
  • вкладка
  • новая строка (\ n)
  • возврат каретки (\ r)
  • подача формы
  • вертикальная табуляция

Кроме того:

  • для Python 2 с включенным re.UNICODE,
  • для Python 3 без дополнительных действий,

..._ 4_ также охватывает пробельные символы Unicode, например:

  • неразрывное пространство,
  • em пробел
  • идеографическое пространство,

...и т.д. См. Полный список здесь, в разделе «Символы Юникода со свойством White_Space».

Однако \s НЕ покрывает символы, не классифицированные как пробелы, которые де-факто являются пробелами, например, среди прочего:

  • соединитель нулевой ширины,
  • Монгольский разделитель гласных,
  • неразрывный пробел нулевой ширины (он же знак порядка байтов),

...и т.д. См. Полный список здесь, в разделе «Связанные символы Unicode без свойства White_Space».

Таким образом, эти 6 символов включены в список во втором регулярном выражении \u180B|\u200B|\u200C|\u200D|\u2060|\uFEFF.

Источники:

person Tim Yates    schedule 18.09.2010
comment
Это гораздо менее хакерское решение, чем принятый ответ. - person John Smith; 31.01.2018
comment
Это более явный, чем другие ответы, поэтому для меня это торт. - person Tristan; 13.02.2019
comment
Принятый ответ старый, с тех времен, когда почти никто не использовал Python 3 и, следовательно, не охватывает строки Unicode. Кроме того, необязательно идти на оптимизацию, о которой не просили. Вот почему я обновил этот ответ как лучший, на мой взгляд. - person Greg Dubicki; 02.09.2020
comment
@GregDubicki спасибо за дополнения. Я добавил простой вариант, так как полный список может быть избыточным в некоторых ситуациях или вредным, если вам нужно сохранить спецификацию (но, надеюсь, вы этого не сделаете). Также отметил MVS, так как это мой любимый символ Unicode, и он все еще был Zs, когда я изначально писал это. :П - person Tim Yates; 02.09.2020
comment
Спасибо, @TimYates! Я сделал еще одно изменение, чтобы полностью отделить регистр ASCII-only от случая UTF-8. Этот ответ теперь стал длинным, но более читаемым и его легче скопировать и вставить, как это всем нравится. ;) - person Greg Dubicki; 03.09.2020
comment
Это изменение показалось вводящим в заблуждение (\s достаточно во многих ситуациях со строками Unicode, а не только ASCII) и добавило сложности, подчеркнув Python 2 (который сейчас EOL, а вопрос помечен как Python 3). Я думаю, что краткого упоминания Python 2 и объяснения различий достаточно, чтобы выбрать правильный подход. - person Tim Yates; 03.09.2020
comment
Хорошо, мне нравится @TimYates. :) Я только что внес почти пустую правку, потому что считаю, что заслуживаю быть видимым как редактор этого ответа. - person Greg Dubicki; 04.09.2020

В качестве альтернативы,

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

А вот версия Python3:

"strip my spaces".translate(str.maketrans('', '', string.whitespace))
person Dan Menes    schedule 20.05.2013
comment
это кажется самым питоническим. почему он не был поставлен на первое место? - person rbp; 09.06.2013
comment
Код Python 3 в ответе работает. Комментарий от @DanMenes устарел - person igo; 06.10.2017
comment
@ZelphirKaltstahl вам нужно import string - person Shahryar Saljoughi; 31.10.2019
comment
string.whitespace - это только пробел ASCII, поэтому это не сработает для строк, содержащих такие вещи, как U + 2028 LINE SEPARATOR. - person user2357112 supports Monica; 03.09.2020

Самый простой - использовать replace:

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

В качестве альтернативы используйте регулярное выражение:

import re
re.sub(r"\s", "", "foo bar\t")
person carl    schedule 18.09.2010

Удалите начальные пробелы в Python

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

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

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

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

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

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

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

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

\s в вашем шаблоне будет соответствовать пробельным символам, а не только пробелам (табуляции, новые строки и т. Д.). Подробнее об этом можно прочитать в руководстве.

person Matthew Iselin    schedule 18.09.2010
comment
Я не знаю, как использовать регулярные выражения :( - person wrongusername; 18.09.2010
comment
@wrongusername: Обновлено со ссылкой на страницу руководства по модулю re. - person Matthew Iselin; 18.09.2010

Как упоминал Роджер Пейт, у меня работал следующий код:

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

Я использую Jupyter Notebook для запуска следующего кода:

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
person Yogesh    schedule 27.06.2018

Применяются стандартные методы фильтрации списка, хотя они не так эффективны, как методы split/join или translate.

Нам понадобится набор пробелов:

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

Встроенный filter:

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

Составление списка (да, используйте скобки: см. Тест ниже):

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

Сгиб:

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

Контрольный показатель:

>>> 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
person jferard    schedule 04.04.2019

TL / DR

Это решение было протестировано с использованием Python 3.6.

Чтобы удалить все пробелы из строки в Python3, вы можете использовать следующую функцию:

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

Чтобы удалить любые пробельные символы ('\ t \ n \ r \ x0b \ x0c'), вы можете использовать следующую функцию:

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

Объяснение

Метод str.translate в Python - это встроенный метод класса str, он принимает таблицу и возвращает копию строки с каждым символом, отображаемым через переданную таблицу преобразования. Полная документация для str.translate

Для создания таблицы перевода используется str.maketrans. Этот метод является еще одним встроенным методом класса str. Здесь мы используем его только с одним параметром, в данном случае со словарем, где ключи - это символы, которые должны быть заменены, сопоставленные со значениями со значением замены символов. Он возвращает таблицу перевода для использования с str.translate. Полная документация для str.maketrans

Модуль string в Python содержит некоторые общие строковые операции и константы. string.whitespace - это константа, которая возвращает строку, содержащую все символы ASCII, которые считаются пробелами. Сюда входят пробел, табуляция, перевод строки, возврат, перевод формы и вертикальная табуляция. Полная документация для строки

Во второй функции dict.fromkeys используется для создания словаря, где ключи являются символами в строке, возвращаемой string.whitespace, каждый со значением None. Полная документация для dict.fromkeys

person R. Arctor    schedule 27.03.2019

Если оптимальная производительность не является требованием, и вам просто нужно что-то очень простое, вы можете определить базовую функцию для проверки каждого символа, используя встроенный в строковый класс метод "isspace":

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

Построение no_white_space строки таким образом не будет иметь идеальной производительности, но решение легко понять.

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

Если вы не хотите определять функцию, вы можете преобразовать это во что-то отдаленно похожее с пониманием списка. Заимствование из join верхнего ответа:

>>> "".join([c for c in "strip my spaces" if not c.isspace()])
'stripmyspaces'
person nBurn    schedule 08.11.2019

person    schedule
comment
Добро пожаловать в SO. Хотя мы благодарим вас за ваш ответ, было бы лучше, если бы он предоставил дополнительную ценность помимо других ответов. В этом случае ваш ответ не дает дополнительной ценности, поскольку другой пользователь уже опубликовал это решение. Если предыдущий ответ был вам полезен, вы должны проголосовать за него, когда у вас будет достаточно репутации. - person Maximilian Peters; 25.10.2016
comment
Это не отвечает на вопрос, как удалить все пробелы. Он только удаляет пробелы - person Nick; 30.09.2018