Escaping Karakter Khusus dalam Regex Python
Anggaplah kita perlu membuat karakter khusus mewakili dirinya sendiri. Untuk itu, karakter tersebut harus di-escape menggunakan backslash. Mari kita lihat contohnya.
Contoh
Dalam contoh berikut, penulis regex ingin
pola pencarian terlihat seperti: huruf
'a', lalu plus '+', lalu
huruf 'x'. Namun, penulis kode
tidak meng-escape karakter '+' sehingga
pola pencarian sebenarnya terlihat seperti:
huruf 'a' satu kali atau lebih,
lalu huruf 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Hasil eksekusi kode:
'a+x ! ! !'
Contoh
Sekarang penulis meng-escape plus dengan
backslash. Sekarang pola pencarian terlihat
seperti yang diinginkan: huruf 'a', lalu plus
'+', lalu huruf 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Hasil eksekusi kode:
'! ax aax aaax'
Contoh
Dalam contoh ini, polanya terlihat seperti:
huruf 'a', lalu titik '.',
lalu huruf 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Hasil eksekusi kode:
'! abx azx'
Contoh
Dalam contoh berikutnya, penulis lupa meng-escape slash dan semua substring terpengaruh oleh regex, karena titik yang tidak di-escape mewakili karakter apa pun:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Hasil eksekusi kode:
'! ! !'
Catatan
Perhatikan bahwa jika Anda lupa backslash untuk titik (ketika seharusnya mewakili dirinya sendiri) - hal ini mungkin tidak terlihat:
res = re.sub('a.x', '!', 'a.x')
print(res) # mengembalikan '!', seperti yang kita inginkan
Secara visual berfungsi dengan benar (karena titik
mewakili karakter apa pun, termasuk
titik biasa '.'). Tetapi jika kita mengubah
string tempat penggantian terjadi - kita akan
melihat kesalahan kita:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # mengembalikan '! ! !', sedangkan yang diharapkan '! abx azx'
Daftar karakter khusus dan biasa
Jika meng-escape karakter biasa - tidak ada masalah - karakter tersebut tetap akan mewakili dirinya sendiri. Pengecualian - angka, angka tidak dapat di-escape.
Seringkali muncul keraguan, apakah karakter tertentu adalah karakter khusus. Beberapa orang sampai pada titik di mana mereka meng-escape semua karakter yang mencurigakan secara berurutan. Namun, ini adalah praktik yang buruk (mengotori regex dengan backslash).
Termasuk karakter khusus: $ ^ . * + ? \ / {} [] () |
Bukan karakter khusus: @ : , ' " - _ = < > % # ~ `& !
Tugas Praktis
Diberikan string:
txt = 'a.a aba aea'
Tuliskan regex yang akan menemukan string
'a.a', tanpa mengambil yang lainnya.
Diberikan string:
txt = '2+3 223 2223'
Tuliskan regex yang akan menemukan string
'2+3', tanpa mengambil yang lainnya.
Diberikan string:
txt = '23 2+3 2++3 2+++3 345 567'
Tuliskan regex yang akan menemukan string
'2+3', '2++3', '2+++3',
tanpa mengambil yang lainnya (+ bisa berapa saja
jumlahnya).
Diberikan string:
txt = '23 2+3 2++3 2+++3 445 677'
Tuliskan regex yang akan menemukan string
'23', '2+3', '2++3',
'2+++3', tanpa mengambil yang lainnya.
Diberikan string:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Tuliskan regex yang akan menemukan string
'*q+', '*qq+', '*qqq+',
tanpa mengambil yang lainnya.
Diberikan string:
txt = '[abc] {abc} abc (abc) [abc]'
Tuliskan regex yang akan menemukan string
dalam kurung siku dan menggantinya dengan
'!'.