Как мне убрать все пробелы в строке Python? Например, я хочу, чтобы строка, подобная которой, strip my spacesбыла превращена stripmyspaces, но я не могу сделать это с помощью strip():
>>> 'strip my spaces'.strip()
'strip my spaces'
Как мне убрать все пробелы в строке Python? Например, я хочу, чтобы строка, подобная которой, strip my spacesбыла превращена stripmyspaces, но я не могу сделать это с помощью strip():
>>> 'strip my spaces'.strip()
'strip my spaces'
Ответы:
Воспользуйтесь преимуществами поведения 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+замена. Я бы придерживался ре.
s.translateметод случайно? Вероятно, это лучше, чем все методы, показанные на этой странице.
None- хотя, что удивительно, это делает его медленнее ...
myString.translate(None, " \t\r\n\v"). Это займет всего 83% до тех пор, пока самая быстрая техника Роджера (разделение и соединение). Не уверен, что он охватывает все пробельные символы, которые разделяет, но, вероятно, будет достаточно для большинства приложений ASCII.
>>> import re
>>> re.sub(r'\s+', '', 'strip my spaces')
'stripmyspaces'
Также обрабатывает любые пробельные символы, о которых вы не думаете (поверьте, их много).
С другой стороны,
"strip my spaces".translate( None, string.whitespace )
И вот версия Python3:
"strip my spaces".translate(str.maketrans('', '', string.whitespace))
NameError: name 'string' is not defined,
import string
Самое простое - это заменить:
"foo bar\t".replace(" ", "").replace("\t", "")
В качестве альтернативы используйте регулярное выражение:
import re
re.sub(r"\s", "", "foo bar\t")
string1=" This is Test String to strip leading space"
print string1
print string1.lstrip()
string2="This is Test String to strip trailing space "
print string2
print string2.rstrip()
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(" ", "")
Попробуйте регулярное выражение с re.sub. Вы можете найти все пробелы и заменить на пустую строку.
\sв вашем шаблоне будут совпадать пробельные символы - а не просто пробел (табуляции, новые строки и т. д.). Вы можете прочитать больше об этом в руководстве .
import re
re.sub(' ','','strip my spaces')
Как упоминал Роджер Пейт, следующий код работал для меня:
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
Применяются стандартные методы фильтрации списка, хотя они не так эффективны, как методы 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
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
Если оптимальная производительность не является обязательным требованием и вы просто хотите что-то очень простое, вы можете определить базовую функцию для проверки каждого символа, используя встроенный в класс «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'