Как удалить все пробелы в строке 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.3x медленнее, помните, что ваши узкие места, безусловно, находятся в другом месте. Большинство программ не заметили разницы между любыми из этих 3 вариантов.
>>> 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))
Простейшим является использование replace:
"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
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)))
объяснение
Python-метод str.translate
- это встроенный метод класса str, он берет таблицу и возвращает копию строки, каждый символ которой отображается через переданную таблицу перевода. Полная документация для str.translate
Для создания таблицы str.maketrans
используется str.maketrans
. Этот метод является еще одним встроенным методом класса str
. Здесь мы используем его только с одним параметром, в данном случае это словарь, где ключи - это заменяемые символы, сопоставленные со значениями со значением замены символов. Возвращает таблицу перевода для использования с str.translate
. Полная документация для str.maketrans
string
модуль в Python содержит некоторые общие строковые операции и константы. string.whitespace
- это константа, которая возвращает строку, содержащую все символы ASCII, которые считаются пробелами. Сюда входят пространство символов, табуляция, перевод строки, возврат, подача формы и вертикальная табуляция. Полная документация для строки
Во второй функции dict.fromkeys
используется для создания словаря, ключами которого являются символы в строке, возвращаемые string.whitespace
каждый со значением None
. Полная документация для dict.fromkeys
Применяются стандартные методы фильтрации списка, хотя они не так эффективны, как методы 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