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:

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

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

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

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

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

print(res) # vypíše 'b!'

Praktické úlohy

Задание 1

Je dán řetězec obsahující názvy funkcí:

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

Získejte pole názvů funkcí z řetězce.

Задание 2

Je dán řetězec s tagem:

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

Získejte pole názvů atributů tohoto tagu.

Задание 3

Je dán řetězec s proměnnými:

pythontxt = '$aaa $bbb $ccc xxxx'

Získejte podřetězce, před kterými stojí znak dolaru.