Python regular ifodalarida ijobiydan oldin va keyin qarash
Ba'zan quyidagi tipdagi masalani yechish kerak bo'ladi:
'aaa' satrini topish va uni
'!' bilan almashtirish, lekin faqat
'aaa' dan keyin 'x' turgan
holatdagina, 'x' ning o'zini esa
almashtirmaslik. Agar biz bu masalani
"boshidanoq" yechishga harakat qilsak,
hech narsa chiqmaydi:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # chiqadi '! baaa', lekin '!x baaa' ni xohlaymiz
Oldinga qarash
Masalani yechish uchun 'x' ni
almashtirish shart emasligini aytish
usuli kerak. Buning uchun (?= )
maxsus qavslari ishlatiladi, ular faqat
qaraydi, lekin o'ziga olmaydi.
Bu qavslar ijobiydan oldin qarash
deyiladi. Ijobiy - chunki 'x'
(bizning holatimizda) bo'lishi kerak -
shunda almashtirish amalga oshadi.
Keling, ushbu qavslarni masalamizni yechish uchun qo'llaymiz:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # chiqadi '!x aaab
Salbiydan oldin qarash ham mavjud
- (?! ) - u, aksincha, biror narsa
bo'lmasligi kerakligini bildiradi. Quyidagi
misolda, almashtirish faqat 'aaa'
dan keyin 'x' bo'lmaganda amalga oshadi:
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # chiqadi 'aaax !b'
Orqaga qarash
Xuddi shunday, ijobiydan keyin qarash
ham mavjud - (?<= ). Quyidagi
misolda, almashtirish faqat 'aaa'
dan oldin 'x' turganida amalga oshadi:
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # chiqadi 'x!'
Shuningdek, salbiydan keyin qarash
ham mavjud - (?<! ). Quyidagi
misolda, almashtirish faqat 'aaa'
dan oldin 'x' bo'lmaganda amalga oshadi:
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # chiqadi 'b!'
Amaliy masalalar
Funksiya nomlarini o'z ichiga olgan satr berilgan:
txt = 'func1() func2() func3()'
Satzdan funksiya nomlari massivini oling.
Teg bilan satr berilgan:
txt = '<a href="" class="eee" id="zzz">'
Ushbu tegning atribut nomlari massivini oling.
O'zgaruvchilar bilan satr berilgan:
txt = '$aaa $bbb $ccc xxxx'
Oldida dollar belgisi turgan pastki satrlarni oling.