Saya perlu menghapus semua karakter khusus, tanda baca dan spasi dari string sehingga saya hanya memiliki huruf dan angka.
Saya perlu menghapus semua karakter khusus, tanda baca dan spasi dari string sehingga saya hanya memiliki huruf dan angka.
Jawaban:
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 cepat
Berikut adalah regex yang cocok dengan serangkaian karakter yang bukan huruf atau angka:
[^A-Za-z0-9]+
Berikut adalah perintah Python untuk melakukan substitusi regex:
re.sub('[^A-Za-z0-9]+', '', mystring)
+
quantifier untuk sedikit meningkatkan efisiensinya.)
[^A-Za-z0-9 ]+
Cara yang lebih pendek:
import re
cleanString = re.sub('\W+','', string )
Jika Anda ingin spasi antara kata dan angka gantikan '' dengan ''
r'\W+'
- agak off topic (dan sangat pedantic) tapi saya menyarankan kebiasaan bahwa semua pola regex menjadi string mentah
Setelah 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!!!'
'.join(e for e in string if e.isalnum())
string1
- Hasil: 10.7061979771string2
- Hasil: 7.78372597694import re
re.sub('[^A-Za-z0-9]+', '', string)
string1
- Hasil: 7.10785102844string2
- Hasil: 4.12814903259import 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 .
''.join([*filter(str.isalnum, string)])
Saya pikir hanya filter(str.isalnum, string)
berfungsi
In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
Dalam Python3, filter( )
fungsi akan mengembalikan objek yang dapat diubah (bukan string seperti di atas). Kita harus bergabung kembali untuk mendapatkan string dari isertable:
''.join(filter(str.isalnum, string))
atau untuk lulus list
digunakan bergabung ( tidak yakin tetapi bisa sedikit cepat )
''.join([*filter(str.isalnum, string)])
catatan: membongkar yang [*args]
valid dari Python> = 3.5
map
, filter
dan reduce
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))
perbaikan filter(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 sebagai filter( )
di Python3 mengembalikan iterator bukan jenis argumen seperti Python-2 +.
#!/usr/bin/python
import re
strs = "how much for the maple syrup? $20.99? That's ricidulous!!!"
print strs
nstr = re.sub(r'[?|$|.|!]',r'',strs)
print nstr
nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr)
print nestr
Anda dapat menambahkan lebih banyak karakter khusus dan itu akan diganti dengan '' tidak berarti apa-apa yaitu mereka akan dihapus.
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:
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
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.
import re
s = re.sub(r"[^a-z0-9]","",s.lower())
Dengan asumsi Anda ingin menggunakan regex dan Anda ingin / perlu kode Unicode-cognizant 2.x yang siap 2to3:
>>> import re
>>> rx = re.compile(u'[\W_]+', re.UNICODE)
>>> data = u''.join(unichr(i) for i in range(256))
>>> rx.sub(u'', data)
u'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\xaa\xb2 [snip] \xfe\xff'
>>>
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:
import unicodedata
# strip of crap characters (based on the Unicode database
# categorization:
# http://www.sql-und-xml.de/unicode-database/#kategorien
PRINTABLE = set(('Lu', 'Ll', 'Nd', 'Zs'))
def filter_non_printable(s):
result = []
ws_last = False
for c in s:
c = unicodedata.category(c) in PRINTABLE and c or u'#'
result.append(c)
return u''.join(result).replace(u'#', u' ')
Lihatlah URL yang diberikan di atas untuk semua kategori terkait. Tentu saja Anda juga dapat memfilter menurut kategori tanda baca.
$
di akhir setiap baris?
string.punctuation berisi karakter berikut:
'! "# $% & \' () * +, -. / :; <=>? @ [\] ^ _` {|} ~ '
Anda dapat menggunakan fungsi terjemahan dan maketrans untuk memetakan tanda baca ke nilai kosong (ganti)
import string
'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))
Keluaran:
'This is A test'
Gunakan terjemahkan:
import string
def clean(instr):
return instr.translate(None, string.punctuation + ' ')
Peringatan: Hanya berfungsi pada string ascii.
TypeError: translate() takes exactly one argument (2 given)
dengan py3.4
import re
my_string = """Strings are amongst the most popular data types in Python. We can create the strings by enclosing characters in quotes. Python treats single quotes the
sama dengan tanda kutip ganda. "" "
# if we need to count the word python that ends with or without ',' or '.' at end
count = 0
for i in text:
if i.endswith("."):
text[count] = re.sub("^([a-z]+)(.)?$", r"\1", i)
count += 1
print("The count of Python : ", text.count("python"))
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)
dan Anda akan melihat hasilnya sebagai
'askhnlaskdjalsdk
re
tetapi tidak pernah menggunakannya. replace
Kriteria Anda hanya berfungsi untuk string spesifik ini. Bagaimana jika string Anda abc = "askhnl#$%!askdjalsdk"
? Saya tidak berpikir akan bekerja pada apa pun selain #$%
polanya. Mungkin ingin mengubahnya
Menghapus Tanda Baca, Angka, dan Karakter Khusus
Contoh: -
Kode
combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ")
Terima kasih :)
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:
re.sub('[^A-ZÜÖÄa-z0-9]+', '', mystring)