Видаліть усе пробіли в рядку


787

Я хочу усунути весь пробіл із рядка на обох кінцях і між словами.

У мене є цей код Python:

def my_handle(self):
    sentence = ' hello  apple  '
    sentence.strip()

Але це лише виключає пробіли з обох сторін рядка. Як видалити весь пробіл?


4
Яким повинен бути ваш результат? hello apple? helloapple?
Марк Байєрс

4
@JoachimPileborg, не зовсім я думаю, бо мова йде також про скорочення пробілів між словами.
wal-o-mat

3
helloapple повинен бути моїм виходом
co2f2e

8
Виправте мене, якщо не так, але "пробіл" не є синонімом "символів пробілу". Поточна відповідь, позначена правильною, не видаляє весь пробіл . Але, оскільки він позначений як правильний, він, мабуть, відповів на намічене запитання? Тож ми повинні відредагувати питання, щоб відобразити прийняту відповідь? @Kalanamith Чи хочете ви чи все-таки видалити пробіл чи лише пробіли?
AnnanFay

Відповіді:


1658

Якщо ви хочете видалити провідні та кінцеві пробіли, скористайтеся str.strip():

sentence = ' hello  apple'
sentence.strip()
>>> 'hello  apple'

Якщо ви хочете видалити всі символи пробілу, використовуйте str.replace():

(Примітка. Це видаляє лише "звичайний" пробіл ASCII, ' ' U+0020але не будь-який інший пробіл )

sentence = ' hello  apple'
sentence.replace(" ", "")
>>> 'helloapple'

Якщо ви хочете видалити дублювані пробіли, скористайтеся str.split():

sentence = ' hello  apple'
" ".join(sentence.split())
>>> 'hello apple'

42
Велич цієї функції полягає в тому, що вона також видаляє '\ r \ n' з html-файлу, який я отримав від Beautiful Soup.
lsheng

27
Мені подобається "" .join (предложение.split ()), це видаляє весь пробіл (пробіли, вкладки, нові рядки) з будь-якої точки речення.
дон

тут починаючий. Чи може хтось пояснити мені, чому друк (фраза. Приєднатися (вирок.спіт ())) призводить до "привіт привіт яблуко"? Просто хочу зрозуміти, як тут обробляється код.
Янніс Дран

2
@YannisDran перевіряє документацію str.join () , коли ви телефонуєте, sentence.join(str_list)ви просите python приєднати елементи з str_list з sentenceроздільником.
Седрик Жульєн

1
"".join(sentence.split())насправді є канонічним рішенням, ефективно видаляючи весь пробіл, а не просто пробіли. Відмінну відповідь Марка Байєрса , мабуть, слід було б прийняти замість цієї менш застосовної відповіді.
Сесіль Карі

263

Щоб видалити лише пробіли, використовуйте str.replace:

sentence = sentence.replace(' ', '')

Для того, щоб видалити всі символи пробілу (пробіл, табуляція, переклад рядка, і так далі) , ви можете використовувати splitте join:

sentence = ''.join(sentence.split())

або регулярний вираз:

import re
pattern = re.compile(r'\s+')
sentence = re.sub(pattern, '', sentence)

Якщо ви хочете видалити пробіл лише з початку і до кінця, ви можете використовувати strip:

sentence = sentence.strip()

Ви можете також використовувати lstripдля видалення пробілів лише з початку рядка, а rstripтакож пробілу з кінця рядка.


Примітка: Вам не потрібно компілювати крок, re.sub (та друзі) кешувати складений шаблон. Дивіться також відповідь Еміля .
Енді Хейден

python3:yourstr.translate(str.maketrans('', '', ' \n\t\r'))
de0202392

104

Альтернативою є використання регулярних виразів та відповідність цим дивним символам з пробілами . Ось кілька прикладів:

Видаліть ВСІ пробіли в рядку, навіть між словами:

import re
sentence = re.sub(r"\s+", "", sentence, flags=re.UNICODE)

Видаліть пробіли в BEGINNING рядка:

import re
sentence = re.sub(r"^\s+", "", sentence, flags=re.UNICODE)

Видаліть пробіли в кінці рядка:

import re
sentence = re.sub(r"\s+$", "", sentence, flags=re.UNICODE)

Видаліть пробіли як у BEGINNING, так і в END в рядку:

import re
sentence = re.sub("^\s+|\s+$", "", sentence, flags=re.UNICODE)

Видаліть ТІЛЬКІ ДУПЛІКАТНІ пробіли:

import re
sentence = " ".join(re.split("\s+", sentence, flags=re.UNICODE))

(Усі приклади працюють і в Python 2, і в Python 3)


Не працює для "\ u202a1234 \ u202c". Дає такий же вихід: u '\ u202a1234 \ u202c'
Саранг

@Sarang: Це не символи пробілу (google їх і ви побачите), а "Загальні знаки пунктуації". Моя відповідь стосується лише видалення символів, класифікованих як пробіли.
Еміль Стенстрем

Це єдине рішення, яке я бачу тут, яке видаляє цих проклятих набридливих символів пробілу unicode, спасибі fam
CapnShanty

41

Пробіл включає простір, вкладки та CRLF . Отже, елегантна та однолінійна струнна функція, яку ми можемо використовувати str.translate:

Пітон 3

' hello  apple'..translate(str.maketrans('', '', ' \n\t\r'))

АБО якщо ви хочете бути ретельними:

import string
' hello  apple'..translate(str.maketrans('', '', string.whitespace))

Пітон 2

' hello  apple'.translate(None, ' \n\t\r')

АБО якщо ви хочете бути ретельними:

import string
' hello  apple'.translate(None, string.whitespace)

2
Це не допоможе з пробілами Unicode, як-от\xc2\xa0
Suzana

5
ans.translate( None, string.whitespace )виробляє тільки builtins.TypeError: translate() takes exactly one argument (2 given)для мене. Документи кажуть, що аргумент - це таблиця перекладу, див. String.maketrans (). Але дивіться коментар Амнона Харела нижче.
user405

2
' hello apple'.translate(str.maketrans('', '', string.whitespace))Примітка: краще зробити змінну для зберігання транс-таблиці, якщо ви збираєтесь робити це кілька разів.
Шоган Аверса-Друесне

16

Для видалення пробілів від початку та до кінця використовуйте strip.

>> "  foo bar   ".strip()
"foo bar"

1
Питання конкретно запитує про видалення всього пробілу, а не лише на кінцях. Будь ласка, зверніть увагу.
Шаян Шафік

9
' hello  \n\tapple'.translate({ord(c):None for c in ' \n\t\r'})

MaK вже вказував на "перекласти" метод вище. І ця варіація працює з Python 3 (див. Це питання ).


2
Дякую! Або xxx.translate( { ord(c) :None for c in string.whitespace } )для ґрунтовності.
user405

7

Будь обережний:

strip робить rstrip та lstrip (видаляє провідні та кінцеві пробіли, вкладки, повертає та формує канали, але він не видаляє їх посередині рядка).

Якщо ви замінюєте лише пробіли та вкладки, ви можете приховати CRLF, які схожі на те, що ви шукаєте, але не є однаковими.


3
import re    
sentence = ' hello  apple'
re.sub(' ','',sentence) #helloworld (remove all spaces)
re.sub('  ',' ',sentence) #hello world (remove double spaces)

3
питання було занадто видалити весь пробіл, який включає вкладки та нові символи рядків, цей фрагмент видалить лише звичайні пробіли.
Максиміліан Петерс

3

Крім того, смуга має деякі варіанти:

Видаліть пробіли в BEGINNING і END рядка:

sentence= sentence.strip()

Видаліть пробіли в BEGINNING рядка:

sentence = sentence.lstrip()

Видаліть пробіли в кінці рядка:

sentence= sentence.rstrip()

Всі три функції рядка strip lstripі rstripможуть приймати параметри рядка до смужки, за замовчуванням - це все пробіл. Це може бути корисно, коли ви працюєте з чимось конкретним, наприклад, ви можете видаляти лише пробіли, але не нові рядки:

" 1. Step 1\n".strip(" ")

Або ви можете видалити зайві коми після читання у списку рядків:

"1,2,3,".strip(",")

1

усуньте пробіл з рядка на обох кінцях і між словами.

>>> import re
>>> re.sub("\s+", # one or more repetition of whitespace
    '', # replace with empty string (->remove)
    ''' hello
...    apple
... ''')
'helloapple'

Документи Python:


Я знаю, reщо було запропоновано раніше, але я виявив, що фактична відповідь на назву питання трохи прихована серед усіх інших варіантів.
обробляти
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.