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 baaa'
Сондай-ақ негативті алға қарай іздеу
бар - (?! ) - ол, керісінше, бір нәрсенің
болмауы керек екенін білдіреді. Келесі мысалда
алмастыру тек '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'
Алдында доллар белгісі тұрған ішкі жолдарды алыңыз.