Przegląd dodatni i ujemny w wyrażeniach regularnych Pythona
Czasami trzeba rozwiązać zadanie tego typu:
znaleźć ciąg 'aaa' i zamienić go
na '!', ale tylko jeśli po
'aaa' znajduje się 'x', a samego
'x' przy tym nie zamieniać. Jeśli
spróbujemy rozwiązać zadanie 'na siłę',
to nic nam nie wyjdzie:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # wypisze '! baaa', a chcieliśmy '!x baaa'
Przegląd do przodu
Aby rozwiązać zadanie, potrzebny jest sposób, aby powiedzieć,
że 'x' nie należy zamieniać. Robi się
to za pomocą specjalnych nawiasów (?= ),
które tylko sprawdzają, ale nie pobierają ze
sobą.
Te nawiasy nazywają się przegląd dodatni do przodu. Dodatni - ponieważ 'x'
(w naszym przypadku) musi być - tylko wtedy
nastąpi zamiana.
Zastosujmy te nawiasy do rozwiązania naszego zadania:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # wypisze '!x aaab
Istnieje też przegląd ujemny do przodu
- (?! ) - on, przeciwnie, mówi,
że czegoś nie powinno być. W następnym
przykładzie zamiana nastąpi tylko jeśli
po 'aaa' NIE znajduje się 'x':
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # wypisze 'aaax !b'
Przegląd do tyłu
Analogicznie istnieje przegląd dodatni
do tyłu - (?<= ). W
następnym przykładzie zamiana nastąpi tylko,
jeśli przed 'aaa' znajduje się 'x':
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # wypisze 'x!'
Istnieje również przegląd ujemny do tyłu
- (?<! ). W następnym przykładzie
zamiana nastąpi tylko, jeśli przed
'aaa' nie znajduje się 'x':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # wypisze 'b!'
Zadania praktyczne
Dany jest ciąg zawierający nazwy funkcji:
txt = 'func1() func2() func3()'
Pobierz tablicę nazw funkcji z ciągu.
Dany jest ciąg z tagiem:
txt = '<a href="" class="eee" id="zzz">'
Pobierz tablicę nazw atrybutów tego tagu.
Dany jest ciąg ze zmiennymi:
txt = '$aaa $bbb $ccc xxxx'
Pobierz podciągi, przed którymi znajduje się znak dolara.