Исботкунии мусбат ва манфӣ дар регуляриҳои 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'
Зерсатрҳоеро гиред, ки пеш аз онҳо аломати доллар истода бошад.