Teigiamasis ir neigiamasis priekinės ir galinės eigos peržiūra Python reguliariosiose išraiškose
Kartais reikia išspręsti tokio tipo uždavinį:
rasti eilutę 'aaa' ir pakeisti ją
į '!', bet tik jeigu po
'aaa' yra 'x', o patį
'x' tuo pačiu nepakeisti. Jei mes
pabandysime išspręsti uždavinį 'tiesiogiai',
tai mums nieko neišeis:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # išves '! baaa', o norėjome '!x baaa'
Priekinė eigos peržiūra
Uždaviniui išspręsti reikia būdo pasakyti,
kad 'x' neturėtų būti keičiamas. Tai daroma
naudojant specialiuosius skliaustus (?= ),
kurie tiesiog žiūri, bet nepasigamina
sau.
Šie skliaustai vadinami teigiama priekinės eigos peržiūra. Teigiama - kadangi 'x'
(mūsų atveju) turi būti - tik tada
įvyks pakeitimas.
Panaudokime šiuos skliaustus mūsų uždaviniui išspręsti:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # išves '!x aaab
Yra ir neigiama priekinės eigos peržiūra
- (?! ) - ji, atvirkščiai, sako,
kažko turi nebūti. Šiame
pavyzdyje, pakeitimas įvyks, tik jeigu
po 'aaa' yra NE 'x':
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # išves 'aaax !b'
Galinė eigos peržiūra
Analogiai yra teigiama
galinės eigos peržiūra - (?<= ). Šiame
pavyzdyje pakeitimas įvyks, tik
jeigu prieš 'aaa' yra 'x':
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # išves 'x!'
Ir yra taip pat neigiama galinės eigos peržiūra
- (?<! ). Šiame pavyzdyje
pakeitimas įvyks, tik jeigu prieš
'aaa' nėra 'x':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # išves 'b!'
Praktiniai uždaviniai
Duota eilutė, kurioje yra funkcijų pavadinimai:
txt = 'func1() func2() func3()'
Gaukite funkcijų pavadinimų masyvą iš eilutės.
Duota eilutė su tag'u:
txt = '<a href="" class="eee" id="zzz">'
Gaukite šio tag'o atributų pavadinimų masyvą.
Duota eilutė su kintamaisiais:
txt = '$aaa $bbb $ccc xxxx'
Gaukite poeilutes, prieš kurias yra dolerio ženklas.