Python kullanarak bir karakter dizisinden belirli karakterleri kaldırmaya çalışıyorum. Şu anda kullandığım kod bu. Ne yazık ki dizgiye hiçbir şey yapmıyor gibi görünüyor.
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
Bunu nasıl düzgün yapabilirim?
Python'daki dizgiler değiştirilemez (değiştirilemez). Bu nedenle, line.replace(...)
komutunun etkisi eskisini değiştirmek yerine sadece yeni bir string oluşturmaktır. Bu değişkenin bu karakterler kaldırılarak yeni değeri almasını sağlamak için onu line
değişkenine yeniden bağlamanız (atamanız) gerekir.
Ayrıca, bunu yapma şekliniz nispeten biraz yavaş olacaktır. Ayrıca, iki kat iç içe geçmiş bir yapı görüp bir an için daha karmaşık bir şey olduğunu düşünecek olan deneyimli python kullanıcıları için biraz kafa karıştırıcı olması muhtemeldir.
Python 2.6 ve daha yeni Python 2.x sürümlerinden * başlayarak, bunun yerine str.translate
kullanabilirsiniz (ancak Python 3 farklılıkları için okumaya devam edin):
line = line.translate(None, '!@#$')
veya re.sub
ile düzenli ifade değiştirme
import re
line = re.sub('[!@#$]', '', line)
Parantez içine alınan karakterler bir karakter sınıfı oluşturur. Bu sınıfta yer alan line
içindeki karakterler sub
öğesinin ikinci parametresiyle değiştirilir: boş bir dize.
Python 3'te dizgiler Unicode'dur. Biraz farklı çevirmeniz gerekecek. kevpie cevaplardan birindeki yorum'da bundan bahsediyor ve str.translate belgesinde de belirtiliyor.
Bir Unicode dizesinin translate
yöntemini çağırırken, yukarıda kullandığımız ikinci parametreyi geçemezsiniz. Ayrıca ilk parametre olarak None
parametresini ya da string.maketrans
metodundan bir çeviri tablosunu da geçiremezsiniz. Bunun yerine, tek parametre olarak bir sözlük geçirirsiniz. Bu sözlük, karakterlerin ordinal değerlerini (yani, karakterler üzerinde ord
çağrısının sonucunu), onların yerine geçmesi gereken karakterlerin sıralı değerleriyle ya da -bizim için kullanışlı bir şekilde- silinmesi gerektiğini belirtmek için None
ile eşler.
Yukarıdaki dansı bir Unicode dizesi ile yapmak için şöyle bir şey çağırırsınız
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
Burada dict.fromkeys
ve map
kısa ve öz olarak aşağıdakileri içeren bir sözlük oluşturmak için kullanılır
{ord('!'): None, ord('@'): None, ...}
Daha da basiti, başka bir cevabın da belirttiği gibi, sözlüğü yerinde oluşturun:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
* önceki Python'larla uyumluluk için, None
yerine geçmek üzere bir "null" çeviri tablosu oluşturabilirsiniz:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
Burada string.maketrans
bir çeviri tablosu oluşturmak için kullanılır; bu tablo 0 ile 255 arasındaki sıra değerlerine sahip karakterleri içeren bir dizedir.