Pozitívny a negatívny pohľad v regulárnych výrazoch Python
Niekedy je potrebné vyriešiť úlohu tohto typu:
nájsť reťazec 'aaa' a nahradiť ho
na '!', ale iba ak za
'aaa' nasleduje 'x', pričom samotné
'x' sa nenahrádza. Ak sa pokúsime
vyriešiť úlohu 'priamo',
nič sa nám nepodarí:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # vypíše '! baaa', ale chceli sme '!x baaa'
Pohľad dopredu
Na vyriešenie úlohy je potrebný spôsob, ako povedať,
že 'x' by sa nemalo nahrádzať. Robí sa
to pomocou špeciálnych zátvoriek (?= ),
ktoré iba kontrolujú, ale neberú so
sebou.
Tieto zátvorky sa nazývajú pozitívny pohľad
dopredu. Pozitívny - pretože 'x'
(v našom prípade) musí byť prítomný - až vtedy
prebehne nahradenie.
Použime tieto zátvorky na vyriešenie nášho problému:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # vypíše '!x aaab
Existuje aj negatívny pohľad dopredu
- (?! ) - ten naopak hovorí,
že niečo by nemalo byť prítomné. V nasledujúcom
príklade nahradenie prebehne iba ak
za 'aaa' nie je 'x':
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # vypíše 'aaax !b'
Pohľad dozadu
Podobne existuje pozitívny
pohľad dozadu - (?<= ). V
nasledujúcom príklade nahradenie prebehne iba
ak pred 'aaa' je 'x':
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # vypíše 'x!'
A tiež existuje negatívny pohľad dozadu
- (?<! ). V nasledujúcom príklade
nahradenie prebehne iba ak pred
'aaa' nie je 'x':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # vypíše 'b!'
Praktické úlohy
Daný reťazec obsahujúci názvy funkcií:
txt = 'func1() func2() func3()'
Získajte pole názvov funkcií z reťazca.
Daný reťazec s tagom:
txt = '<a href="" class="eee" id="zzz">'
Získajte pole názvov atribútov tohto tagu.
Daný reťazec s premennými:
txt = '$aaa $bbb $ccc xxxx'
Získajte podreťazce, pred ktorými je znak dolára.