Як зняти пробіл з рядка


179

Як я знімаю всі пробіли в рядку пітона? Наприклад, я хочу, щоб рядок, на зразок якого 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: Ви можете бути здивовані, але дивіться примітку "запам'ятати".

@Roger Хм. цікаво. Ви випробували s.translateметод випадково? Це, мабуть, перемагає всі методи, показані на цій сторінці.
ОТЗ

@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))

це здається найбільш пітонічним. чому він не був звернений до вершини?
rbp

Код Python 3 у відповідь справді працює. Коментар від @DanMenes застарілий
igo

3
NameError: name 'string' is not defined.
Зельфір Кальтшталь

@ZelphirKaltstahl вам потрібноimport string
Shahryar Saljoughi

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()

Видаліть whiteSpaces з початку та кінця рядка в 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(" ", "")

3

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

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


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

@wrongusername: оновлено посиланням на сторінку посібника з повторного модуля.
Матвій Іселін

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

3
Ласкаво просимо до SO. Хоча ми дякуємо вам за вашу відповідь, було б краще, якби вона надала додаткову цінність поверх інших відповідей. У цьому випадку ваша відповідь не надає додаткового значення, оскільки інший користувач вже розмістив це рішення. Якщо попередня відповідь була для вас корисною, ви повинні проголосувати за неї, коли у вас буде достатня репутація
Максиміліан Пітерс

Це не відповідає на питання "як видалити всю пробіл". Це видаляє лише пробіли
Нік

2

Як згадував Роджер Пате, для мене працював наступний код:

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

Я використовую ноутбук Jupyter для запуску наступного коду:

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" класу string:

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.