Python'da bir dizeden belirli karakterleri kaldırma

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?

Çözüm

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.

Yorumlar (7)
line = line.translate(None, " ?.!/;:")
Yorumlar (2)

Python'da dizeler değişmezdir. Değiştirme işleminden sonra replace metodu yeni bir string döndürür. Deneyin:

for char in line:
    if char in " ?.!/;:":
        line = line.replace(char,'')
Yorumlar (3)