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':

pythontxt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)

print(res)

Hasil eksekusi kode:

python'a+x ! ! !'

Contoh

Sekarang penulis meng-escape plus dengan backslash. Sekarang pola pencarian terlihat seperti yang diinginkan: huruf 'a', lalu plus '+', lalu huruf 'x':

pythontxt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)

print(res)

Hasil eksekusi kode:

python'! ax aax aaax'

Contoh

Dalam contoh ini, polanya terlihat seperti: huruf 'a', lalu titik '.', lalu huruf 'x':

pythontxt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)

print(res)

Hasil eksekusi kode:

python'! 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:

pythontxt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)

print(res)

Hasil eksekusi kode:

python'! ! !'

Catatan

Perhatikan bahwa jika Anda lupa backslash untuk titik (ketika seharusnya mewakili dirinya sendiri) - hal ini mungkin tidak terlihat:

pythonres = 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:

pythonres = 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

Задание 1

Diberikan string:

pythontxt = 'a.a aba aea'

Tuliskan regex yang akan menemukan string 'a.a', tanpa mengambil yang lainnya.

Задание 2

Diberikan string:

pythontxt = '2+3 223 2223'

Tuliskan regex yang akan menemukan string '2+3', tanpa mengambil yang lainnya.

Задание 3

Diberikan string:

pythontxt = '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).

Задание 4

Diberikan string:

pythontxt = '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.

Задание 5

Diberikan string:

pythontxt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'

Tuliskan regex yang akan menemukan string '*q+', '*qq+', '*qqq+', tanpa mengambil yang lainnya.

Задание 6

Diberikan string:

pythontxt = '[abc] {abc} abc (abc) [abc]'

Tuliskan regex yang akan menemukan string dalam kurung siku dan menggantinya dengan '!'.