Python dizesindeki tüm boşlukları nasıl keserim? Örneğin, strip my spaces
dönüştürülmek gibi bir dize istiyorum stripmyspaces
, ancak bunu ile başarmak gibi olamaz strip()
:
>>> 'strip my spaces'.strip()
'strip my spaces'
Python dizesindeki tüm boşlukları nasıl keserim? Örneğin, strip my spaces
dönüştürülmek gibi bir dize istiyorum stripmyspaces
, ancak bunu ile başarmak gibi olamaz strip()
:
>>> 'strip my spaces'.strip()
'strip my spaces'
Yanıtlar:
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'
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.
\s+
oyuncu değişiminden daha yavaştır . Yeniden yapışırdım.
s.translate
Yöntemi şans eseri denediniz mi? Muhtemelen bu sayfada gösterilen tüm yöntemleri yener.
None
, şaşırtıcı olabilir, ancak bu daha yavaş yapıyor ...
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.
>>> 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).
Alternatif olarak,
"strip my spaces".translate( None, string.whitespace )
Ve işte Python3 sürümü:
"strip my spaces".translate(str.maketrans('', '', string.whitespace))
NameError: name 'string' is not defined
.
import string
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(" ", "")
İle normal ifadeyi deneyin re.sub
. Tüm boşlukları arayabilir ve boş bir dizeyle değiştirebilirsiniz.
\s
deseniniz 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 .
import re
re.sub(' ','','strip my spaces')
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
Bir listeyi filtrelemek için kullanılan standart teknikler, split/join
veya translate
yöntemleri kadar etkili olmasa da uygulanır .
Bir dizi beyaz alana ihtiyacımız var:
>>> import string
>>> ws = set(string.whitespace)
filter
builtin:
>>> "".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
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.translate
yö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.maketrans
kullanı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
string
Python modülü bazı ortak dize işlemleri ve sabitler içerir. string.whitespace
boş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.whitespace
her 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
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_space
dize 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'