Позитивен и негативен преглед во регуларните изрази во Python

Понекогаш треба да решите задача од следниов тип: најдете низа 'aaa' и заменете ја со '!', но само ако после 'aaa' стои 'x', а самиот 'x' притоа да не се заменува. Ако се обидеме да ја решиме задачата 'директно', тогаш ништо нема да успееме:

pythontxt = 'aaax baaa'
res = re.sub('aaax', '!', txt)

print(res) # ќе испечати '! baaa', а сакавме '!x baaa'

Преглед напред

За решавање на задачата е потребен начин да се каже, дека 'x' не треба да се заменува. Ова се прави со помош на специјални загради (?= ), кои само гледаат, но не земаат со себе.

Овие загради се нарекуваат позитивен преглед напред. Позитивен - бидејќи 'x' (во нашиот случај) мора да биде - само тогаш ќе се случи замена.

Ајде да ги примениме овие загради за решавање на нашата задача:

pythontxt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # ќе испечати '!x aaab

Постои и негативен преглед напред - (?! ) - тој, обратно, вели, дека нешто не смее да биде. Во следниот пример, замената ќе се случи, само ако после 'aaa' не стои 'x':

pythontxt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)

print(res) # ќе испечати 'aaax !b'

Преглед назад

Слично постои позитивен преглед назад - (?<= ). Во следниот пример замената ќе се случи, само ако пред 'aaa' стои 'x':

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

print(res) # ќе испечати 'x!'

И постои исто така негативен преглед назад - (?<! ). Во следниот пример замената ќе се случи, само ако пред 'aaa' не стои 'x':

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

print(res) # ќе испечати 'b!'

Практични задачи

Задание 1

Дадена е низа, која содржи имиња на функции:

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

Добијте низа од имиња на функции од низата.

Задание 2

Дадена е низа со таг:

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

Добијте низа од имиња на атрибути на овој таг.

Задание 3

Дадена е низа со променливи:

pythontxt = '$aaa $bbb $ccc xxxx'

Добијте поднизи, пред кои стои симболот долар.