Menghadkan Ketamakan dalam Regex di Python
Ungkapan biasa secara lalai adalah tamak. Ini bermakna ia akan menangkap jumlah aksara maksimum yang mungkin. Mari kita lihat contoh. Katakan kita mempunyai tali seperti berikut:
txt = 'aeeex zzz x kkk'
Dalam tali ini, kita ingin mencari sub-tali
'aeeex' berdasarkan pola berikut:
huruf 'a', kemudian sebarang aksara
satu atau lebih kali, kemudian huruf 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Walaupun kita ingin mendapatkan tali '! zzz
x kkk', yang akan dipaparkan ialah tali '! kkk'.
Ini kerana regex kita mencari
semua aksara dari huruf 'a' hingga huruf
'x'. Tetapi dalam tali kita terdapat dua huruf
'x'! Disebabkan ketamakan, regex
akan mencari sehingga huruf 'x' yang terakhir,
sekaligus menangkap lebih daripada yang kita
perlukan.
Sudah tentu, selalunya tingkah laku ini adalah yang kita kehendaki. Tetapi khusus dalam kes ini, kita perlu membatalkan ketamakan dan memberitahu regex supaya ia berhenti pada huruf 'x' yang pertama. Dalam kes ini tanda soal harus diletakkan selepas operator pengulangan:
res = re.sub('a.+?x', '!', txt)
print(res) # akan memaparkan tali '! zzz x kkk'
Ketamakan boleh dihadkan untuk semua operator
pengulangan: sama ada *, ?, atau
{} - seperti ini: *?, ??
dan {}?.
Diberi tali:
txt = 'aba accca azzza wwwwa'
Tuliskan ungkapan biasa yang akan mencari semua
tali yang diapit oleh huruf
'a', dan menggantikan setiap satu daripadanya dengan
'!'. Antara huruf 'a' boleh terdapat
sebarang aksara (kecuali 'a').