Как мне убрать все пробелы в строке 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'