Позитивни и негативни преглед у регуларним изразима Пајтона
Понекад је потребно решити задатак овог типа:
пронаћи стринг 'aaa' и заменити га
са '!', али само ако после
'aaa' стоји 'x', а сам
'x' при томе не мењати. Ако
покушамо да решимо задатак 'директно',
ништа неће успети:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # исписаће '! baaa', а хтели смо '!x baaa'
Преглед напред
За решавање задатка потребан је начин да се каже
да 'x' не треба мењати. То се ради
помоћу специјалних заграда (?= ),
које само проверавају, али не узимају са
собом.
Ове заграде се зову позитиван преглед
напред. Позитиван - јер 'x'
(у нашем случају) мора да буде - само онда
ће се замена десити.
Применимо ове заграде за решавање нашег задатка:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # исписаће '!x aaab
Постоји и негативан преглед напред
- (?! ) - он, обрнуто, каже
да нечега не би требало да буде. У следећем
примеру, замена ће се десити само ако
после 'aaa' стоји НЕ 'x':
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # исписаће 'aaax !b'
Преглед назад
Слично постоји позитиван
преглед назад - (?<= ). У
следећем примеру замена ће се десити само
ако испред 'aaa' стоји 'x':
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # исписаће 'x!'
И постоји такође негативан преглед назад
- (?<! ). У следећем примеру
замена ће се десити само ако испред
'aaa' не стоји 'x':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # исписаће 'b!'
Практични задаци
Дат је стринг који садржи имена функција:
txt = 'func1() func2() func3()'
Добијте низ имена функција из стринга.
Дат је стринг са тагом:
txt = '<a href="" class="eee" id="zzz">'
Добијте низ имена атрибута овог тага.
Дат је стринг са променљивим:
txt = '$aaa $bbb $ccc xxxx'
Добијте подстрингове испред којих стоји симбол долара.