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 line
agar 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 line
yang 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 translate
metode string Unicode, Anda tidak dapat melewatkan parameter kedua yang kami gunakan di atas. Anda juga tidak dapat lulus None
sebagai 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 — None
untuk 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.fromkeys
dan map
digunakan 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.maketrans
digunakan untuk membuat tabel terjemahan , yang hanya berupa string yang berisi karakter dengan nilai ordinal 0 hingga 255.
filter
fungsi 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.