Позитивен и негативен преглед во регуларните изрази во Python
Понекогаш треба да решите задача од следниов тип:
најдете низа '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'
Добијте поднизи, пред кои стои симболот долар.