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 . lineBu sınıftaki tüm karakterler subboş 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 .
translateUnicode dizesinin yöntemini çağırırken, yukarıda kullandığımız ikinci parametreyi geçiremezsiniz. Ayrıca Noneilk 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, ordonları çağırmanın sonucu ), karakterlerin yerine geçmesi gereken sıralı değerlerle veya Nonesilinmeleri 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.fromkeysve 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 .
filterfonksiyonu 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.