რეგულარული გამონათქვამების გაუთვალისწინებლობის შეზღუდვა პითონში
რეგულარული გამონათქვამები ნაგულისხმევად გაუთვალისწინებელია. ეს ნიშნავს, რომ ისინი იღებენ მაქსიმალურ შესაძლო სიმბოლოთა რაოდენობას. მოდი განვიხილოთ მაგალითზე. დავუშვათ, გვაქვს ასეთი სტრიქონი:
txt = 'aeeex zzz x kkk'
ამ სტრიქონში გვსურს ვიპოვოთ ქვესტრიქონი
'aeeex' შემდეგი შაბლონით:
ასო 'a', შემდეგ ნებისმიერი სიმბოლო
ერთი ან მეტჯერ, შემდეგ ასო 'x':
res = re.sub('a.+x', '!', txt)
print(res)
მიუხედავად იმისა, რომ ჩვენ უნდა მივიღოთ სტრიქონი '! zzz
x kkk', დაიბეჭდება სტრიქონი '! kkk'.
მთელი საქმე იმაშია, რომ ჩვენი რეგულარული გამონათქვამი ეძებს
ყველა სიმბოლოს ასოდან 'a' ასომდე
'x'. მაგრამ ჩვენს სტრიქონში ორი ასო
'x'ა! გაუთვალისწინებლობის გამო გამოდის, რომ
რეგულარული გამონათქვამი ეძებს ბოლო x-მდე,
რითაც იღებს არა ისეთს, როგორიც ჩვენ გვჭირდებოდა.
რა თქმა უნდა, ხშირად სწორედ ასეთი ქმედება გვჭირდება. მაგრამ კონკრეტულად ამ შემთხვევაში საჭიროა გაუთვალისწინებლობის გაუქმება და ვუთხრათ რეგულარულ გამონათქვამს, რომ ის პირველ x-მდე ეძებოს. ამ შემთხვევაში გამეორების ოპერატორის შემდეგ უნდა დავსვათ კითხვის ნიშანი:
res = re.sub('a.+?x', '!', txt)
print(res) # დაიბეჭდება სტრიქონი '! zzz x kkk'
გაუთვალისწინებლობის შეზღუდვა შეიძლება ყველა გამეორების ოპერატორს:
როგორც *-ს, ასევე ?-ს და
{}-ს - ასე: *?, ??
და {}?.
მოცემულია სტრიქონი:
txt = 'aba accca azzza wwwwa'
დაწერეთ რეგულარული გამონათქვამი, რომელიც ნახავს ყველა
სტრიქონს, რომლის კიდეებზეც დგას ასო
'a', და შეცვლის თითოეულ მათგანს
'!'-ით. ასოებს 'a' შორის
შეიძლება იყოს ნებისმიერი სიმბოლო (გარდა 'a'-ის).