პოზიტიური და ნეგატიური ნახვა პითონის რეგულარულ გამონათქვამებში
ზოგჯერ საჭიროა ამ类型的 ამოცანის ამოხსნა:
იპოვოთ სტრიქონი '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'
მიიღეთ ქვესტრიქონები, რომლების წინაც დგას დოლარის სიმბოლო.