Python'daki dizeler değiştirilemez (değiştirilemez). Bu nedenle, etkisi line.replace(...)
eskisini değiştirmek yerine sadece yeni bir dize oluşturmaktır. Bu değişkenin yeni değeri almasını sağlamak için bu karakterler kaldırılmış olarak yeniden bağlamanız (atamanız) gerekir line
.
Ayrıca, bunu yapma şekliniz nispeten yavaş olacaktır. Ayrıca, iki kat daha fazla iç içe bir yapı görecek ve bir an için daha karmaşık bir şeyin devam ettiğini düşünecek deneyimli pitonatörler için biraz kafa karıştırıcı olması muhtemeldir.
Python 2.6 ve daha yeni Python 2.x sürümlerinden * başlayarak, str.translate
(ancak Python 3 farkları için okumaya devam edin):
line = line.translate(None, '!@#$')
veya ile düzenli ifade değiştirme re.sub
import re
line = re.sub('[!@#$]', '', line)
Parantez içindeki karakterler bir karakter sınıfı oluşturur . line
Bu sınıftaki tüm karakterler sub
boş bir dize için ikinci parametreyle değiştirilir .
Python 3'te, dizeler Unicode'dur. Biraz daha farklı çevirmen gerekecek. kevpie bundan bahsediyor cevaplardan birine yapılan yorumda ve bunun belgelerindestr.translate
belirtiliyor .
translate
Unicode dizesinin yöntemini çağırırken, yukarıda kullandığımız ikinci parametreyi geçiremezsiniz. Ayrıca None
ilk parametre olarak geçemezsiniz . Bunun yerine, tek çeviri olarak bir çeviri tablosu (genellikle sözlük) iletirsiniz. Bu tablo sıra değerlerini eşler , karakterlerin (yani, ord
onları çağırmanın sonucu ), karakterlerin yerine geçmesi gereken sıralı değerlerle veya None
silinmeleri gerektiğini belirtmek için - bize faydalı olarak - eşleştirir .
Bu yüzden yukarıdaki dansı bir Unicode dizesiyle yapmak için
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
Burada dict.fromkeys
ve map
özlü bir şekilde sözlük içeren bir sözlük oluşturmak için kullanılır
{ord('!'): None, ord('@'): None, ...}
Daha basit, başka bir cevabın ifade ettiği gibi , çeviri tablosunu yerinde oluşturun:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
Veya ile aynı çeviri tablosunu oluşturun str.maketrans
:
unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))
* önceki Pythons ile uyumluluk için, yerine geçmek üzere bir "null" çeviri tablosu oluşturabilirsiniz None
:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
Burada string.maketrans
, yalnızca 0 ila 255 sıra değerlerine sahip karakterleri içeren bir dize olan bir çeviri tablosu oluşturmak için kullanılır .
filter
fonksiyonu ve bir Lambda Expression:filter(lambda ch: ch not in " ?.!/;:", line)
. Bence oldukça özlü ve verimli. Tabii ki, bir ad atamanız gereken yeni bir dize döndürür.