Bir dizedeki tüm boşlukları kaldır


788

Ben bir dize, her iki ucunda ve kelimeler arasında tüm boşluk ortadan kaldırmak istiyorum.

Bu Python kodu var:

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

Ama bu sadece ipin her iki tarafındaki boşlukları ortadan kaldırır. Tüm boşlukları nasıl kaldırabilirim?


4
Sonucunuz nasıl olmalı? hello apple? helloapple?
Mark Byers

4
@JoachimPileborg, tam olarak sanmıyorum, çünkü aynı zamanda kelimeler arasındaki boşlukların azaltılmasıyla da ilgili.
wal-o-mat

3
helloapple benim çıktı olması gerekiyor
co2f2e

8
Yanlışsa beni düzelt, ancak "boşluk" "boşluk karakterleri" ile eş anlamlı değildir. Doğru olarak işaretlenen geçerli cevap tüm boşlukları kaldırmaz . Ancak, doğru olarak işaretlendiğinden, amaçlanan soruyu cevaplamış olmalıdır? Yani soruyu kabul edilen cevabı yansıtacak şekilde düzenlemeliyiz? @Kalanamith Tüm boşlukları mı yoksa yalnızca boşlukları mı kaldırmak istiyorsunuz?
AnnanFay

Yanıtlar:


1659

Öndeki ve bitişteki boşlukları kaldırmak istiyorsanız, şunu kullanın str.strip():

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

Tüm boşluk karakterlerini kaldırmak istiyorsanız şunu kullanın str.replace():

(Not: bu yalnızca “normal” ASCII boşluk karakterini kaldırır, ' ' U+0020ancak diğer boşlukları kaldırmaz )

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

Çoğaltılan boşlukları kaldırmak istiyorsanız, şunu kullanın str.split():

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

42
Bu işlevin büyüklüğü, aynı zamanda Güzel Çorba'dan aldığım html dosyasından '\ r \ n' öğesini kaldırmasıdır.
lsheng

27
Ben "" .join (sentence.split ()) gibi, tüm boşluk (boşluklar, sekmeler, yeni satırlar) cümle herhangi bir yerden kaldırır.
don

burada acemi. Birisi bana neden print (sentence.join (sentence.split ())) 'hello hello appleapple' ile sonuçlandığını açıklayabilir mi? Kodun burada nasıl işlendiğini anlamak istiyorum.
Yannis Dran

2
@YannisDran, str.join () belgelerine bakın , aradığınızda sentence.join(str_list)python'dan str_list öğesinden sentenceayırıcı olarak öğelere katılmasını isteyin .
Cédric Julien

1
"".join(sentence.split())aslında kanonik bir çözümdür, sadece boşluklardan ziyade tüm boşlukları etkili bir şekilde ortadan kaldırır . Mark Byers ' mükemmel cevabı muhtemelen bu daha az uygulanabilir cevap yerine kabul edilmiş olmalıdır.
Cecil Curry

263

Yalnızca boşlukları kaldırmak için şunu kullanın str.replace:

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

Kaldırmak için tüm boş karakterleri (boşluk, sekme, vb satır) kullanabilirsiniz splitardından join:

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

veya normal bir ifade:

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

Boşluğu yalnızca başlangıçtan ve sondan kaldırmak istiyorsanız şunları kullanabilirsiniz strip:

sentence = sentence.strip()

lstripBoşluğu yalnızca dizenin başından rstripkaldırmak ve boşluku dizenin sonundan kaldırmak için de kullanabilirsiniz .


Not: Adımı derlemenize gerek yoktur, re.sub (ve arkadaşları) derlenmiş deseni önbelleğe almanıza gerek yoktur. Ayrıca bakınız, Emil'in cevabı .
Andy Hayden

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

104

Bir alternatif, normal ifadeler kullanmak ve bu garip beyaz boşluk karakterleriyle eşleşmektir . İşte bazı örnekler:

Bir dizedeki kelimeler arasında bile olsa TÜM boşlukları kaldırın:

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

Bir dizenin BAŞLANGIÇındaki boşlukları kaldırın:

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

Bir dizenin END'indeki boşlukları kaldırın:

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

Bir dizenin BAŞLANGIÇ ve SONUNDA boşlukları kaldırın:

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

SADECE ÇİFTLİ boşlukları kaldırın:

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

(Tüm örnekler hem Python 2 hem de Python 3'te çalışır)


"\ U202a1234 \ u202c" için çalışmadı. Aynı çıktıyı verir: u '\ u202a1234 \ u202c'
Sarang

@Sarang: Bunlar boşluk karakteri değil (google ve onları göreceksiniz) ama "Genel Noktalama İşaretleri" dir. Cevabım yalnızca boşluk olarak sınıflandırılan karakterlerin kaldırılmasıyla ilgilidir.
Emil Stenström

Bu lanet olası sinir bozucu unicode boşluk karakterleri kaldırır burada gördüğüm tek çözüm, teşekkürler fam
CapnShanty

41

Boşluk içeren boşluk, sekme ve CRLF . Kullanabileceğimiz zarif ve tek katmanlı bir dize işlevi str.translate:

Python 3

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

VEYA ayrıntılı olmak istiyorsanız:

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

Python 2

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

VEYA ayrıntılı olmak istiyorsanız:

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

2
Bu, Unicode gibi beyaz alanlara yardımcı olmaz\xc2\xa0
Suzana

5
ans.translate( None, string.whitespace )sadece builtins.TypeError: translate() takes exactly one argument (2 given)benim için üretiyor . Docs, bağımsız değişkenin bir çeviri tablosu olduğunu söylüyor, bkz. String.maketrans (). Fakat aşağıdaki Amnon Harel tarafından yapılan yoruma bakınız.
user405

2
' hello apple'.translate(str.maketrans('', '', string.whitespace))Not: Bunu birden çok kez yapmak istiyorsanız trans-tabloyu depolamak için bir değişken yapmak daha iyidir.
Shogan Aversa-Druesne

16

Boşluğu başlangıçtan ve sondan kaldırmak için kullanın strip.

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

1
Soru, özellikle yalnızca boşlukların değil tüm boşlukların kaldırılmasını ister. Lütfen dikkat edin.
Shayan Shafiq

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

MaK, yukarıdaki "tercüme" yöntemine zaten dikkat çekti. Ve bu varyasyon Python 3 ile çalışır (bkz. Bu soru-cevap ).


2
Teşekkürler! Veya xxx.translate( { ord(c) :None for c in string.whitespace } )titizlik için.
user405

7

Dikkatli ol:

strip rstrip ve lstrip yapar (baştaki ve sondaki boşlukları, sekmeleri, döndürme ve form beslemelerini kaldırır, ancak dizenin ortasında bunları kaldırmaz).

Yalnızca boşlukları ve sekmeleri değiştirirseniz, aradıklarınızla eşleşen, ancak aynı olmayan gizli CRLF'lerle karşılaşabilirsiniz.


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

3
soru, sekmeleri ve yeni satır karakterlerini içeren tüm beyaz alanı kaldırmaktı, bu snippet yalnızca normal boşlukları kaldıracaktı.
Maximilian Peters

3

Ek olarak, şeridin bazı varyasyonları vardır:

Bir dizenin BEGINNING ve END içindeki boşlukları kaldırın:

sentence= sentence.strip()

Bir dizenin BAŞLANGIÇındaki boşlukları kaldırın:

sentence = sentence.lstrip()

Bir dizenin END'indeki boşlukları kaldırın:

sentence= sentence.rstrip()

Her üç dize işlevi strip lstripve dizenin rstripparametrelerini şerit olarak alabilir, varsayılan değer tüm beyaz boşluktur. Bu, belirli bir şeyle çalışırken faydalı olabilir, örneğin, yalnızca boşlukları kaldırabilir, yeni satırları kaldıramazsınız:

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

Veya bir dize listesinde okurken fazladan virgülleri kaldırabilirsiniz:

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

1

bir dizeden, her iki uçta ve sözcükler arasındaki boşlukları ortadan kaldırır.

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

Python belgeleri:


Daha reönce önerildiğini biliyorum , ancak soru başlığına gerçek cevabın diğer tüm seçenekler arasında biraz gizli olduğunu buldum.
işlemek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.