Dizeden tüm boşluk nasıl şeritlenir


179

Python dizesindeki tüm boşlukları nasıl keserim? Örneğin, strip my spacesdönüştürülmek gibi bir dize istiyorum stripmyspaces, ancak bunu ile başarmak gibi olamaz strip():

>>> 'strip my spaces'.strip()
'strip my spaces'

13
Str.strip öğesinin yalnızca önde gelen ve sondaki boşlukları etkilediğini unutmayın.

Yanıtlar:


311

Sep parametresi olmadan str.split'in davranışından yararlanmak:

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

Tüm boşluklar yerine boşlukları kaldırmak istiyorsanız:

>>> s.replace(" ", "")
'\tfoo\nbar'

Erken optimizasyon

Verimlilik birincil hedef olmasa da - net kod yazmak — ilk zamanlamaları aşağıda bulabilirsiniz:

$ 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

Normal ifadenin önbelleğe alındığına dikkat edin, bu yüzden hayal edeceğiniz kadar yavaş değildir. Önceden derlemek bazılarına yardımcı olur, ancak pratikte sadece bunu birçok kez çağırırsanız önemli olacaktır :

$ 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 daha yavaş olsa da, darboğazlarınızın başka yerlerde olduğundan emin olabilirsiniz. Çoğu program bu 3 seçenekten herhangi biri arasındaki farkı fark etmez.


Muhtemelen \s+oyuncu değişiminden daha yavaştır . Yeniden yapışırdım.
OTZ

@OTZ: Şaşırmış olabilirsin ama "hatırla" notuna bak.

@Roger Hmm. ilginç. s.translateYöntemi şans eseri denediniz mi? Muhtemelen bu sayfada gösterilen tüm yöntemleri yener.
OTZ

@Roger Pate: Çeviri için 'tablo' argümanına ihtiyacınız yok None, şaşırtıcı olabilir, ancak bu daha yavaş yapıyor ...
martineau

1
Deneyin myString.translate(None, " \t\r\n\v"). Roger'ın en hızlı (bölme ve birleştirme) tekniği sadece% 83'ü alır. Bölünen tüm beyaz boşluk karakterlerini kapsadığından emin değilim, ancak çoğu ASCII uygulaması için muhtemelen yeterli olacaktır.
brianmearns

60
>>> import re
>>> re.sub(r'\s+', '', 'strip my spaces')
'stripmyspaces'

Ayrıca aklınıza gelmeyen tüm boşluk karakterlerini de işler (inanın bana, çok şey var).


3
Bu, kabul edilen cevaptan çok daha az çözümdür.
John Smith

Bu diğer cevaplardan daha açıktır, bu yüzden pastayı benim için alır.
Tristan

34

Alternatif olarak,

"strip my spaces".translate( None, string.whitespace )

Ve işte Python3 sürümü:

"strip my spaces".translate(str.maketrans('', '', string.whitespace))

bu en pitonik gibi görünüyor. neden zirveye çıkmadı?
rbp

Yanıtta Python 3 kodu çalışıyor. @DanMenes adlı kullanıcının yorumu eski
igo

3
NameError: name 'string' is not defined.
Zelphir Kaltstahl

@ZelphirKaltstahl gerekimport string
Shahryar Saljoughi

13

En basit yerine replace kullanmaktır:

"foo bar\t".replace(" ", "").replace("\t", "")

Alternatif olarak, normal bir ifade kullanın:

import re
re.sub(r"\s", "", "foo bar\t")

10

Python'daki Başlangıç ​​Boşluklarını Kaldırma

string1="    This is Test String to strip leading space"
print string1
print string1.lstrip()

Python'daki Sondaki veya Son Alanları Kaldırma

string2="This is Test String to strip trailing space     "
print string2
print string2.rstrip()

Python'da dizenin Başından ve sonundan whiteSpaces öğesini kaldırın

string3="    This is Test String to strip leading and trailing space      "
print string3
print string3.strip()

Python'daki tüm boşlukları kaldır

string4="   This is Test String to test all the spaces        "
print string4
print string4.replace(" ", "")

3

İle normal ifadeyi deneyin re.sub . Tüm boşlukları arayabilir ve boş bir dizeyle değiştirebilirsiniz.

\sdeseniniz yalnızca boşlukla (sekmeler, yeni satırlar vb.) değil boşluk karakterleriyle eşleşir. Bununla ilgili daha fazla bilgiyi kılavuzda bulabilirsiniz .


Regexes nasıl kullanılacağını bilmiyorum :(
wrongusername 18:10

@wrongusername: Yeniden modül el kitabı sayfasına bir bağlantıyla güncellendi.
Matthew Iselin

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

3
SO hoş geldiniz. Cevabınız için teşekkür etmemize rağmen, diğer cevapların üzerine ek değer katması daha iyi olurdu. Bu durumda, başka bir kullanıcı bu çözümü zaten gönderdiğinden cevabınız ek değer sağlamaz. Önceki bir yanıt size yardımcı olduysa, yeterli itibara sahip olduğunuzda oy vermelisiniz
Maximilian Peters

Bu, "tüm beyaz alanların nasıl kaldırılacağı" sorusuna cevap vermez. Sadece boşlukları kaldırır
Nick

2

Roger Pate tarafından belirtildiği gibi aşağıdaki kod benim için çalıştı:

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

Aşağıdaki kodu çalıştırmak için Jupyter Notebook kullanıyorum:

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

Bir listeyi filtrelemek için kullanılan standart teknikler, split/joinveya translateyöntemleri kadar etkili olmasa da uygulanır .

Bir dizi beyaz alana ihtiyacımız var:

>>> import string
>>> ws = set(string.whitespace)

filterbuiltin:

>>> "".join(filter(lambda c: c not in ws, "strip my spaces"))
'stripmyspaces'

Bir liste kavrama (evet, köşeli parantezleri kullanın: aşağıdaki karşılaştırmaya bakın):

>>> import string
>>> "".join([c for c in "strip my spaces" if c not in ws])
'stripmyspaces'

Kat:

>>> import functools
>>> "".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))
'stripmyspaces'

Karşılaştırma:

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

Bu çözelti Python 3.6 kullanılarak test edildi

Python3'teki bir dizeden tüm boşlukları çıkarmak için aşağıdaki işlevi kullanabilirsiniz:

def remove_spaces(in_string: str):
    return in_string.translate(str.maketrans({' ': ''})

Boşluk karakterlerini ('\ t \ n \ r \ x0b \ x0c') kaldırmak için aşağıdaki işlevi kullanabilirsiniz:

import string
def remove_whitespace(in_string: str):
    return in_string.translate(str.maketrans(dict.fromkeys(string.whitespace)))

açıklama

Python'un str.translateyöntemi, str'nin yerleşik bir sınıf yöntemidir, bir tablo alır ve geçirilen çeviri tablosuyla eşlenen her karakterin dizenin bir kopyasını döndürür.Str.translate için tam belgeler

Çeviri tablosu oluşturmak için str.maketranskullanılır. Bu yöntem başka bir yerleşik sınıf yöntemidir str. Burada onu sadece bir parametre ile, bu durumda bir sözlükle kullanıyoruz, burada anahtarlar, karakterlerin değiştirilme değeriyle değerlerle eşleştirilecek karakterlerdir. İle kullanmak için bir çeviri tablosu döndürür str.translate. Str.maketrans için tam belgeler

stringPython modülü bazı ortak dize işlemleri ve sabitler içerir. string.whitespaceboşluk olarak kabul edilen tüm ASCII karakterlerini içeren bir dize döndüren bir sabittir. Bu, boşluk, sekme, satır besleme, dönüş, form besleme ve dikey sekme karakterlerini içerir. Dize için tam dokümantasyon

İkinci işlevde dict.fromkeys, anahtarların dizedeki string.whitespaceher biri tarafından değer döndürülen karakterler olduğu bir sözlük oluşturmak için kullanılır None. Dict.fromkeys için tam belgeler


0

En iyi performans bir gereklilik değilse ve sadece basit bir şeyin olmasını istiyorsanız, dize sınıfının yerleşik "isspace" yöntemini kullanarak her karakteri test etmek için temel bir işlev tanımlayabilirsiniz:

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

Bina no_white_spacedize bu şekilde ideal bir performansa sahip, ama çözüm kolay anlaşılır olmayacaktır.

>>> remove_space('strip my spaces')
'stripmyspaces'

Bir işlev tanımlamak istemiyorsanız, bunu liste kavrayışı ile belirsiz bir şekilde benzer bir şeye dönüştürebilirsiniz. En yüksek yanıtın joinçözümünden borçlanma :

>>> "".join([c for c in "strip my spaces" if not c.isspace()])
'stripmyspaces'
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.