String dalam Python tidak dapat diubah (tidak dapat diubah). Karena itu, efeknya line.replace(...)hanya untuk membuat string baru, daripada mengubah yang lama. Anda perlu mem - rebind (menugaskan) itu lineagar variabel itu mengambil nilai baru, dengan karakter-karakter itu dihapus.
Juga, cara Anda melakukannya akan agak lambat, relatif. Ini juga mungkin agak membingungkan bagi pythonators berpengalaman, yang akan melihat struktur bersarang ganda dan berpikir sejenak bahwa sesuatu yang lebih rumit sedang terjadi.
Dimulai dengan Python 2.6 dan versi Python 2.x yang lebih baru *, Anda dapat menggunakan str.translate, (tetapi baca terus untuk perbedaan Python 3):
line = line.translate(None, '!@#$')
atau penggantian ekspresi reguler dengan re.sub
import re
line = re.sub('[!@#$]', '', line)
Karakter yang dilampirkan dalam tanda kurung merupakan kelas karakter . Setiap karakter lineyang ada di kelas itu diganti dengan parameter kedua menjadi sub: string kosong.
Dalam Python 3, string adalah Unicode. Anda harus menerjemahkan sedikit berbeda. kevpie menyebutkan ini dalam komentar di salah satu jawaban, dan itu tercantum dalam dokumentasi untukstr.translate .
Saat memanggil translatemetode string Unicode, Anda tidak dapat melewatkan parameter kedua yang kami gunakan di atas. Anda juga tidak dapat lulus Nonesebagai parameter pertama. Sebagai gantinya, Anda melewati tabel terjemahan (biasanya kamus) sebagai satu-satunya parameter. Tabel ini memetakan nilai - nilai ordinal karakter (yaitu hasil memanggilnya ord) ke nilai-nilai ordinal karakter yang harus menggantikannya, atau — berguna bagi kita — Noneuntuk menunjukkan bahwa mereka harus dihapus.
Jadi untuk melakukan tarian di atas dengan string Unicode Anda akan memanggil sesuatu seperti
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
Di sini dict.fromkeysdan mapdigunakan untuk membuat kamus berisi secara ringkas
{ord('!'): None, ord('@'): None, ...}
Lebih sederhana, seperti jawaban lain , buat tabel terjemahan di tempat:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
Atau buat tabel terjemahan yang sama dengan str.maketrans:
unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))
* untuk kompatibilitas dengan Python sebelumnya, Anda dapat membuat tabel terjemahan "null" untuk menggantikan None:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
Di sini string.maketransdigunakan untuk membuat tabel terjemahan , yang hanya berupa string yang berisi karakter dengan nilai ordinal 0 hingga 255.
filterfungsi dan Ekspresi Lambda:filter(lambda ch: ch not in " ?.!/;:", line). Cukup ringkas dan efisien juga, saya pikir. Tentu saja, ini mengembalikan string baru yang harus Anda tetapkan namanya.