Apa cara terbaik untuk menghapus semua karakter non alfanumerik dari sebuah string, menggunakan Python?
Solusi yang disajikan dalam varian PHP dari pertanyaan ini mungkin akan bekerja dengan beberapa penyesuaian kecil, tetapi tampaknya tidak terlalu 'pythonic' bagi saya.
Sebagai catatan, saya tidak hanya ingin menghapus titik dan koma (dan tanda baca lainnya), tetapi juga mengutip, tanda kurung, dll.
Jawaban:
Saya hanya menghitung waktu beberapa fungsi karena penasaran. Dalam tes ini saya menghapus karakter non-alfanumerik dari string
string.printable
(bagian daristring
modul bawaan). Penggunaan dikompilasi'[\W_]+'
danpattern.sub('', str)
ditemukan paling cepat.sumber
valid_characters = string.ascii_letters + string.digits
diikuti olehjoin(ch for ch in string.printable if ch in valid_characters)
dan itu 6 mikrodetik lebih cepat dariisalnum()
opsi. Masih jauh lebih lambat daripada regexp sekalipun.pattern.sub('', string.printable)
sebaliknya - konyol untuk memanggil re.sub ketika Anda memiliki objek RE! -).re.compile('[\W_]+', re.UNICODE)
untuk membuatnya unicode aman.Ekspresi reguler untuk penyelamatan:
sumber
\W
akan tetap menggarisbawahi juga.Gunakan metode str.translate () .
Anggap Anda akan sering melakukan ini:
(1) Sekali, buat string yang berisi semua karakter yang ingin Anda hapus:
(2) Setiap kali Anda ingin mengikis string:
Biaya setup mungkin lebih baik dibandingkan dengan kompilasi ulang; biaya marjinal jauh lebih rendah:
Catatan: Menggunakan string.printable sebagai data benchmark memberikan pola '[\ W _] +' keuntungan yang tidak adil ; semua karakter non-alfanumerik berada dalam satu tandan ... dalam data biasa akan ada lebih dari satu penggantian yang harus dilakukan:
Inilah yang terjadi jika Anda memberi sedikit lebih banyak pekerjaan untuk dilakukan:
sumber
string.punctuation
Alih-alih''.join(c for c in map(chr, range(256)) if not c.isalnum())
str
objek tetapi bukanunicode
objek..join()
?Kamu bisa mencoba:
sumber
sumber
Bagaimana tentang:
Ini bekerja dengan menggunakan pemahaman daftar untuk menghasilkan daftar karakter
InputString
jika mereka hadir dalam gabunganascii_letters
dandigits
string. Kemudian bergabung daftar menjadi string.sumber
Sebagai gantinya dari beberapa jawaban lain di sini, saya menawarkan cara yang sangat sederhana dan fleksibel untuk mendefinisikan sekumpulan karakter yang Anda ingin membatasi konten string. Dalam hal ini, saya mengizinkan tanda alfanumerik PLUS dan garis bawah. Cukup tambahkan atau hapus karakter dari saya
PERMITTED_CHARS
sesuai kasus penggunaan Anda.sumber
string.digits + string.ascii_letters + '_-'
.SPECIAL_CHARS = '_-'
dan kemudian menggunakanstring.digits + string.ascii_letters + SPECIAL_CHARS
sumber
e for e in sent
dan memeriksa melaluiif e.isalpha()
pernyataan jika karakter saat ini adalah simbol alfabet, jika demikian - bergabung dengansent
variabel melaluisent = "".join()
dan semua simbol non-alfabet akan diganti dengan""
(string kosong) karena darijoin
fungsi.sumber
Pengaturan waktu dengan string acak dari printable ASCII:
Hasil (Python 3.7):
str.maketrans
&str.translate
tercepat, tetapi termasuk semua karakter non-ASCII.re.compile
&pattern.sub
lebih lambat, tetapi entah bagaimana lebih cepat dari''.join
&filter
.sumber
Jika saya mengerti dengan benar cara termudah adalah dengan menggunakan ekspresi reguler karena memberikan Anda banyak fleksibilitas tetapi metode sederhana lainnya adalah menggunakan untuk loop berikut adalah kode dengan contoh saya juga menghitung kemunculan kata dan disimpan dalam kamus ..
nilai ini jika jawaban ini berguna!
sumber