Saya perlu menghapus semua karakter khusus, tanda baca dan spasi dari string sehingga saya hanya memiliki huruf dan angka.
236
Ini dapat dilakukan tanpa regex:
>>> string = "Special $#! characters spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'
Anda bisa menggunakan str.isalnum
:
S.isalnum() -> bool Return True if all characters in S are alphanumeric and there is at least one character in S, False otherwise.
Jika Anda bersikeras menggunakan regex, solusi lain akan baik-baik saja. Namun perhatikan bahwa jika itu dapat dilakukan tanpa menggunakan ekspresi reguler, itulah cara terbaik untuk melakukannya.
isalnum()
dan regex, dan regex 50-75% lebih cepatBerikut adalah regex yang cocok dengan serangkaian karakter yang bukan huruf atau angka:
Berikut adalah perintah Python untuk melakukan substitusi regex:
sumber
+
quantifier untuk sedikit meningkatkan efisiensinya.)[^A-Za-z0-9 ]+
Cara yang lebih pendek:
Jika Anda ingin spasi antara kata dan angka gantikan '' dengan ''
sumber
r'\W+'
- agak off topic (dan sangat pedantic) tapi saya menyarankan kebiasaan bahwa semua pola regex menjadi string mentahSetelah melihat ini, saya tertarik untuk memperluas jawaban yang disediakan dengan mencari tahu yang dieksekusi dalam waktu paling sedikit, jadi saya memeriksa dan memeriksa beberapa jawaban yang diajukan dengan
timeit
dua contoh string:string1 = 'Special $#! characters spaces 888323'
string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'
Contoh 1
'.join(e for e in string if e.isalnum())
string1
- Hasil: 10.7061979771string2
- Hasil: 7.78372597694Contoh 2
import re re.sub('[^A-Za-z0-9]+', '', string)
string1
- Hasil: 7.10785102844string2
- Hasil: 4.12814903259Contoh 3
import re re.sub('\W+','', string)
string1
- Hasil: 3.11899876595string2
- Hasil: 2.78014397621Hasil di atas adalah produk dengan hasil pengembalian terendah dari rata-rata:
repeat(3, 2000000)
Contoh 3 dapat 3x lebih cepat dari Contoh 1 .
sumber
''.join([*filter(str.isalnum, string)])
Python 2. *
Saya pikir hanya
filter(str.isalnum, string)
berfungsiPython 3. *
Dalam Python3,
filter( )
fungsi akan mengembalikan objek yang dapat diubah (bukan string seperti di atas). Kita harus bergabung kembali untuk mendapatkan string dari isertable:atau untuk lulus
list
digunakan bergabung ( tidak yakin tetapi bisa sedikit cepat )catatan: membongkar yang
[*args]
valid dari Python> = 3.5sumber
map
,filter
danreduce
kembali objek itertable gantinya. Masih dalam Python3 + saya akan lebih suka''.join(filter(str.isalnum, string))
(atau untuk lulus daftar digunakan bersama''.join([*filter(str.isalnum, string)])
) daripada jawaban yang diterima.''.join(filter(str.isalnum, string))
perbaikanfilter(str.isalnum, string)
, setidaknya untuk membaca. Apakah ini benar-benar cara Pythreenic (ya, Anda bisa menggunakan itu) untuk melakukan ini?filter(str.isalnum, string)
tidak kembali string di Python3 sebagaifilter( )
di Python3 mengembalikan iterator bukan jenis argumen seperti Python-2 +.Anda dapat menambahkan lebih banyak karakter khusus dan itu akan diganti dengan '' tidak berarti apa-apa yaitu mereka akan dihapus.
sumber
Berbeda dengan orang lain yang menggunakan regex, saya akan mencoba untuk mengecualikan setiap karakter yang bukan yang saya inginkan, alih-alih menyebutkan secara eksplisit apa yang tidak saya inginkan.
Misalnya, jika saya ingin hanya karakter dari 'a ke z' (huruf besar dan kecil) dan angka, saya akan mengecualikan yang lainnya:
Ini berarti "mengganti setiap karakter yang bukan angka, atau karakter dalam rentang 'a ke z' atau 'A ke Z' dengan string kosong".
Bahkan, jika Anda memasukkan karakter khusus
^
di tempat pertama regex Anda, Anda akan mendapatkan negasi.Ekstra tip: Jika Anda juga perlu huruf kecil hasilnya, Anda dapat membuat regex lebih cepat dan lebih mudah, selama Anda tidak akan menemukan huruf besar setiap saat.
sumber
Dengan asumsi Anda ingin menggunakan regex dan Anda ingin / perlu kode Unicode-cognizant 2.x yang siap 2to3:
sumber
sumber
Pendekatan yang paling umum adalah menggunakan 'kategori' dari tabel unicodedata yang mengklasifikasikan setiap karakter tunggal. Misalnya kode berikut memfilter hanya karakter yang dapat dicetak berdasarkan kategorinya:
Lihatlah URL yang diberikan di atas untuk semua kategori terkait. Tentu saja Anda juga dapat memfilter menurut kategori tanda baca.
sumber
$
di akhir setiap baris?string.punctuation berisi karakter berikut:
Anda dapat menggunakan fungsi terjemahan dan maketrans untuk memetakan tanda baca ke nilai kosong (ganti)
Keluaran:
sumber
Gunakan terjemahkan:
Peringatan: Hanya berfungsi pada string ascii.
sumber
TypeError: translate() takes exactly one argument (2 given)
dengan py3.4sama dengan tanda kutip ganda. "" "
sumber
dan Anda akan melihat hasilnya sebagai
'askhnlaskdjalsdk
sumber
re
tetapi tidak pernah menggunakannya.replace
Kriteria Anda hanya berfungsi untuk string spesifik ini. Bagaimana jika string Andaabc = "askhnl#$%!askdjalsdk"
? Saya tidak berpikir akan bekerja pada apa pun selain#$%
polanya. Mungkin ingin mengubahnyaMenghapus Tanda Baca, Angka, dan Karakter Khusus
Contoh: -
Kode
Hasil:-
Terima kasih :)
sumber
Untuk bahasa lain seperti Jerman, Spanyol, Denmark, Prancis dll yang berisi karakter khusus (seperti Jerman "Umlaute" sebagai
ü
,ä
,ö
) hanya menambahkan ini ke string pencarian regex:Contoh untuk Bahasa Jerman:
sumber