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


179

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

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

13
Обратите внимание, что str.strip влияет только на начальные и конечные пробелы.

Ответы:


311

Воспользуйтесь преимуществами поведения 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 раза, помните, что ваши узкие места наверняка в другом месте. Большинство программ не заметят разницы между любым из этих 3 вариантов.


Это, вероятно, медленнее, чем \s+замена. Я бы придерживался ре.
OTZ

@OTZ: Вы можете быть удивлены, но смотрите заметку «помните».

@ Роджер Хмм. интересный. Вы пробовали s.translateметод случайно? Вероятно, это лучше, чем все методы, показанные на этой странице.
OTZ

@Roger Pate: вам не нужен аргумент 'table' для перевода, это может быть None- хотя, что удивительно, это делает его медленнее ...
martineau

1
Попробуй myString.translate(None, " \t\r\n\v"). Это займет всего 83% до тех пор, пока самая быстрая техника Роджера (разделение и соединение). Не уверен, что он охватывает все пробельные символы, которые разделяет, но, вероятно, будет достаточно для большинства приложений ASCII.
brianmearns

60
>>> import re
>>> re.sub(r'\s+', '', 'strip my spaces')
'stripmyspaces'

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


3
Это гораздо менее хакерское решение, чем принятый ответ.
Джон Смит

Это более явно, чем другие ответы, поэтому мне нужен торт.
Тристан

34

С другой стороны,

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

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

"strip my spaces".translate(str.maketrans('', '', string.whitespace))

это кажется самым питоническим. почему не проголосовали за это?
ОПБ

Код Python 3 в ответе работает. Комментарий от @DanMenes устарел
УГИ

3
NameError: name 'string' is not defined,
Зельфир Кальцталь

@ZelphirKaltstahl вам нужноimport string
Шахриар Салджоуи

13

Самое простое - это заменить:

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

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

import re
re.sub(r"\s", "", "foo bar\t")

10

Удалить начальные пробелы в 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()

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

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

3

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

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


Я не знаю, как использовать регулярные выражения :(
неправильное имя

@wrongusername: Обновлено со ссылкой на страницу руководства re module.
Мэтью Изелин

2
import re
re.sub(' ','','strip my spaces')

3
Добро пожаловать в ТАК. Хотя мы благодарим вас за ваш ответ, было бы лучше, если бы он предоставил дополнительную ценность поверх других ответов. В этом случае ваш ответ не дает дополнительной ценности, так как другой пользователь уже опубликовал это решение. Если предыдущий ответ был вам полезен, вы должны проголосовать за него, как только у вас будет достаточно репутации
Максимилиан Питерс

Это не отвечает на вопрос «как убрать все пробелы». Это только удаляет пробелы
Ник

2

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

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

2

Применяются стандартные методы фильтрации списка, хотя они не так эффективны, как методы 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

0

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

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


0

Если оптимальная производительность не является обязательным требованием и вы просто хотите что-то очень простое, вы можете определить базовую функцию для проверки каждого символа, используя встроенный в класс «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'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.