Запіс на курсы па HTML, CSS, JavaScript, PHP, Python, фрэймворкам і CMS,
а таксама: дапамога ў пошуку працы і заказаў, стажыроўка на рэальных праектах→
⊗pyPmRELAB 72 of 129 menu

Пазітыўны і негатыўны прагляд у рэгулярках 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'

Атрымайце падрадкі, перад якімі стаіць сімвал долара.

byenru