Pozitivní a negativní přehled v regulárních výrazech Pythonu
Někdy je třeba řešit úlohu tohoto typu:
najít řetězec 'aaa' a nahradit jej
na '!', ale pouze pokud za
'aaa' následuje 'x', přičemž
sám 'x' se nenahrazuje. Pokud se
pokusíme úlohu řešit 'přímo',
nic se nám nepovede:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # vypíše '! baaa', ale chtěli jsme '!x baaa'
Přehled vpřed
K řešení úlohy je potřebný způsob, jak říct,
že 'x' by se neměl nahrazovat. To se
dělá pomocí speciálních závorek (?= ),
které pouze "dívají", ale neberou si obsah
s sebou.
Tyto závorky se nazývají pozitivní přehled
vpřed. Pozitivní - protože 'x'
(v našem případě) musí být - pouze tehdy
dojde k nahrazení.
Aplikujme tyto závorky pro řešení naší úlohy:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # vypíše '!x aaab
Existuje také negativní přehled vpřed
- (?! ) - ten naopak říká, že
něco by nemělo být. V následujícím
příkladě dojde k nahrazení pouze tehdy,
pokud za 'aaa' NEnásleduje 'x':
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # vypíše 'aaax !b'
Přehled vzad
Podobně existuje pozitivní přehled
vzad - (?<= ). V
následujícím příkladě dojde k nahrazení pouze tehdy,
pokud před 'aaa' stojí 'x':
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # vypíše 'x!'
A také existuje negativní přehled vzad
- (?<! ). V následujícím příkladě
dojde k nahrazení pouze tehdy, pokud před
'aaa' nestojí 'x':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # vypíše 'b!'
Praktické úlohy
Je dán řetězec obsahující názvy funkcí:
txt = 'func1() func2() func3()'
Získejte pole názvů funkcí z řetězce.
Je dán řetězec s tagem:
txt = '<a href="" class="eee" id="zzz">'
Získejte pole názvů atributů tohoto tagu.
Je dán řetězec s proměnnými:
txt = '$aaa $bbb $ccc xxxx'
Získejte podřetězce, před kterými stojí znak dolaru.