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:

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

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

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

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

pythontxt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)

print(res) # chiqadi 'b!'

Amaliy masalalar

Задание 1

Funksiya nomlarini o'z ichiga olgan satr berilgan:

pythontxt = 'func1() func2() func3()'

Satzdan funksiya nomlari massivini oling.

Задание 2

Teg bilan satr berilgan:

pythontxt = '<a href="" class="eee" id="zzz">'

Ushbu tegning atribut nomlari massivini oling.

Задание 3

O'zgaruvchilar bilan satr berilgan:

pythontxt = '$aaa $bbb $ccc xxxx'

Oldida dollar belgisi turgan pastki satrlarni oling.