Pemerhatian Positif dan Negatif dalam Ungkapan Biasa Python
Kadang-kadang kita perlu menyelesaikan masalah seperti ini:
cari rentetan 'aaa' dan gantikannya
dengan '!', tetapi hanya jika selepas
'aaa' ada 'x', dan 'x' itu
sendiri tidak diganti. Jika kita cuba menyelesaikan
masalah ini 'secara terus',
kita tidak akan berjaya:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # akan output '! baaa', tetapi kita mahu '!x baaa'
Pemerhatian Ke Hadapan
Untuk menyelesaikan masalah ini, kita perlukan cara untuk menyatakan
bahawa 'x' tidak patut diganti. Ini dilakukan
dengan menggunakan kurungan khas (?= ),
yang hanya memerhati, tetapi tidak mengambil
bersama.
Kurungan ini dipanggil pemerhatian positif ke
hadapan. Positif - kerana 'x'
(dalam kes kita) mesti ada - barulah
penukaran akan berlaku.
Mari gunakan kurungan ini untuk menyelesaikan masalah kita:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # akan output '!x aaab
Terdapat juga pemerhatian negatif ke hadapan
- (?! ) - ia, sebaliknya, menyatakan
bahawa sesuatu itu TIDAK patut ada. Dalam contoh
berikutnya, penukaran akan berlaku hanya jika
selepas 'aaa' BUKAN 'x':
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # akan output 'aaax !b'
Pemerhatian Ke Belakang
Secara analogi, terdapat pemerhatian positif
ke belakang - (?<= ). Dalam
contoh berikut, penukaran akan berlaku hanya
jika sebelum 'aaa' ada 'x':
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # akan output 'x!'
Dan terdapat juga pemerhatian negatif ke belakang
- (?<! ). Dalam contoh berikutnya
penukaran akan berlaku hanya jika sebelum
'aaa' TIDAK ada 'x':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # akan output 'b!'
Masalah Praktikal
Diberi satu rentetan yang mengandungi nama fungsi:
txt = 'func1() func2() func3()'
Dapatkan array nama fungsi daripada rentetan tersebut.
Diberi satu rentetan dengan tag:
txt = '<a href="" class="eee" id="zzz">'
Dapatkan array nama atribut untuk tag ini.
Diberi satu rentetan dengan pembolehubah:
txt = '$aaa $bbb $ccc xxxx'
Dapatkan subrentetan yang didahului oleh simbol dolar.