Saya perlu mengganti semua karakter non-ASCII (\ x00- \ x7F) dengan spasi. Saya terkejut bahwa ini tidak mudah mati di Python, kecuali saya kehilangan sesuatu. Fungsi berikut hanya menghapus semua karakter non-ASCII:
def remove_non_ascii_1(text):
return ''.join(i for i in text if ord(i)<128)
Dan yang ini menggantikan karakter non-ASCII dengan jumlah spasi sesuai jumlah byte pada titik kode karakter (yaitu –
karakter diganti dengan 3 spasi):
def remove_non_ascii_2(text):
return re.sub(r'[^\x00-\x7F]',' ', text)
Bagaimana saya bisa mengganti semua karakter non-ASCII dengan satu spasi?
Dari yang segudang dari sejenis SO pertanyaan , tidak ada alamat karakter pengganti sebagai lawan untuk pengupasan , dan juga mengatasi semua karakter non-ascii bukan karakter tertentu.
–
. Ini orangnya .Jawaban:
''.join()
Ekspresi Anda memfilter , menghapus apa pun yang bukan ASCII; Anda bisa menggunakan ekspresi kondisional sebagai gantinya:Ini menangani karakter satu per satu dan masih akan menggunakan satu ruang per karakter yang diganti.
Ekspresi reguler Anda seharusnya hanya mengganti karakter non-ASCII berturut - turut dengan spasi:
Perhatikan di
+
sana.sumber
str.join()
membutuhkan daftar (itu akan melewati nilai dua kali), dan ekspresi generator pertama-tama akan dikonversi menjadi satu. Memberikannya daftar pemahaman hanya lebih cepat. Lihat posting ini .–
karakter diganti dengan 3 spasi" dalam pertanyaan menyiratkan bahwa input adalah bytestring (bukan Unicode) dan oleh karena itu Python 2 digunakan (jika tidak''.join
akan gagal). Jika OP ingin satu ruang per Unicode codepoint maka input harus diterjemahkan ke dalam Unicode terlebih dahulu.Untuk Anda yang mendapatkan representasi paling mirip dari string asli Anda, saya sarankan modul unidecode :
Kemudian Anda bisa menggunakannya dalam sebuah string:
sumber
דותן
. Namun, secara umum ini bagus, terima kasih!Untuk pemrosesan karakter , gunakan string Unicode:
Tetapi perhatikan Anda masih akan memiliki masalah jika string Anda berisi karakter Unicode terurai (karakter yang terpisah dan menggabungkan tanda aksen, misalnya):
sumber
ud.normalize('NFC',s)
untuk menggabungkan tanda, tetapi tidak semua kombinasi kombinasi diwakili oleh satu titik kode tunggal. Anda membutuhkan solusi yang lebih cerdas untuk melihatud.category()
karakter.\X
(eXtended grapheme cluster) regex (didukung olehregex
modul) memungkinkan untuk beralih lebih dari karakter tersebut (catatan: "grapheme tidak harus menggabungkan urutan karakter, dan menggabungkan urutan karakter tidak harus grapheme" ).Jika karakter pengganti bisa '?' alih-alih spasi, maka saya sarankan
result = text.encode('ascii', 'replace').decode()
:Hasil:
sumber
Bagaimana dengan yang ini?
sumber
Sebagai pendekatan asli dan efisien, Anda tidak perlu menggunakan
ord
atau mengulang karakter apa pun. Cukup enkode denganascii
dan mengabaikan kesalahan.Berikut ini hanya akan menghapus karakter non-ascii:
Sekarang jika Anda ingin mengganti karakter yang dihapus lakukan saja hal berikut:
sumber
encode
akan mengembalikan bytestring, jadi ingatlah itu. Selain itu, metode ini tidak akan menghapus karakter seperti baris baru.Berpotensi untuk pertanyaan yang berbeda, tapi saya memberikan versi saya dari jawaban @ Alvero (menggunakan unidecode). Saya ingin melakukan strip "biasa" pada string saya, yaitu awal dan akhir string saya untuk karakter spasi, dan kemudian ganti hanya karakter spasi putih lainnya dengan ruang "biasa", yaitu
untuk
,
Kami pertama-tama mengganti semua ruang non-unicode dengan ruang reguler (dan bergabung kembali lagi),
Dan kemudian kita membaginya lagi, dengan split normal python, dan strip masing-masing "bit",
Dan terakhir bergabung kembali dengan mereka lagi, tetapi hanya jika string melewati
if
tes,Dan dengan itu,
safely_stripped('ㅤㅤㅤㅤCeñíaㅤmañanaㅤㅤㅤㅤ')
kembali dengan benar'Ceñía mañana'
.sumber