პოზიტიური და ნეგატიური ნახვა პითონის რეგულარულ გამონათქვამებში

ზოგჯერ საჭიროა ამ类型的 ამოცანის ამოხსნა: იპოვოთ სტრიქონი 'aaa' და შეცვალოთ იგი '!'-ით, მაგრამ მხოლოდ იმ შემთხვევაში, თუ 'aaa'-ის შემდეგ დგას 'x', თავად 'x' კი არ შეიცვალოს. თუ ჩვენ შევეცდებით ამოცანის ამოხსნას 'პირდაპირ', ჩვენ არაფერი გამოგვივა:

pythontxt = 'aaax baaa'
res = re.sub('aaax', '!', txt)

print(res) # დაწერს '! baaa', მაგრამ გვინდოდა '!x baaa'

წინ ნახვა

ამოცანის ამოსახსნელად საჭიროა გზა, რომ ვთქვათ, რომ 'x' არ უნდა შეიცვალოს. ეს კეთდება სპეციალური ფრჩხილების (?= ) მეშვეობით, რომლებიც მხოლოდ უყურებენ, მაგრამ არ იღებენ თან.

ამ ფრჩხილებს ეწოდება პოზიტიური წინ ნახვა. პოზიტიური - რადგან 'x' (ჩვენს შემთხვევაში) უნდა იყოს - მხოლოდ მაშინ მოხდება ჩანაცვლება.

მოდით გამოვიყენოთ ეს ფრჩხილები ჩვენი ამოცანის ამოსახსნელად:

pythontxt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # დაწერს '!x aaab

არსებობს ნეგატიური წინ ნახვაც - (?! ) - ის, პირიქით, ამბობს, რომ რაღაც არ უნდა იყოს. შემდეგ მაგალითში, ჩანაცვლება მოხდება მხოლოდ იმ შემთხვევაში, თუ 'aaa'-ის შემდეგ არ დგას 'x':

pythontxt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)

print(res) # დაწერს 'aaax !b'

უკან ნახვა

ანალოგიურად არსებობს პოზიტიური უკან ნახვა - (?<= ). შემდეგ მაგალითში ჩანაცვლება მოხდება მხოლოდ იმ შემთხვევაში, თუ 'aaa'-ის წინ დგას 'x':

pythontxt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)

print(res) # დაწერს 'x!'

და ასევე არსებობს ნეგატიური უკან ნახვაც - (?<! ). შემდეგ მაგალითში ჩანაცვლება მოხდება მხოლოდ იმ შემთხვევაში, თუ 'aaa'-ის წინ არ დგას 'x':

pythontxt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)

print(res) # დაწერს 'b!'

პრაქტიკული ამოცანები

Задание 1

მოცემულია სტრიქონი, რომელიც შეიცავს ფუნქციების სახელებს:

pythontxt = 'func1() func2() func3()'

მიიღეთ ფუნქციების სახელების მასივი სტრიქონიდან.

Задание 2

მოცემულია სტრიქონი ტეგით:

pythontxt = '<a href="" class="eee" id="zzz">'

მიიღეთ ამ ტეგის ატრიბუტების სახელების მასივი.

Задание 3

მოცემულია სტრიქონი ცვლადებით:

pythontxt = '$aaa $bbb $ccc xxxx'

მიიღეთ ქვესტრიქონები, რომლების წინაც დგას დოლარის სიმბოლო.