Thursday, August 13, 2015

თავი 11 (11 - 11,1)

თავი 11

Regular expressions


აქამდე ვკითხულობდით ფაილებს, ვეძებდით ნიმუშებს და ვკრეფდით საინტერესო ნაწილებს/ ვიყენებდით სტრინგის მეთოდებს, როგორიცაა split და find ვიყენებდით სიებს და სტრინგის დაჭრას.
მსგავსი დავალებები ძალიან ხშირია. პითონს აქვს ძალიან ძლიერი  ბიბლიოთეკა „regular expressions, რითაც მსგავსი დავალებების მოხდენილად გაკეთება შეიძლება. მიზეზი თუ აქამდე რატომ არ გავეცანით „regular expressions - ს“ არის ის, რომ ის და მისი სინტაქსი ცოტა რთულია.
regular expressions“ თითქმის არის პროგრამირების პატარა ენა ძებნისთვის და სტრინგების გარჩევისთვის. ამ თავში განვიხილავთ რეგულარული გამოსახულების მხოლოდ საფუძვლებს. მეტი ინფორმაციისთვის იხილე:




სანამ შენს პროგრამაში რეგულარული გამოსახულების ბიბლიოთეკის გამოყენებას შეძლებ, მანამდე უნდა გადმოაიმპორტირო.  მისი მარტივად გამოყენება შეიძლება search() ფუნქციით. ქვემოთ მოყვანილი პროგრამა აჩვენებს ძებნის ფუნქციის უბრალო გამოყენებას:


import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if re.search('From:', line) :
print line





გავხსენით ფაილი, დავამარყუჟეთ თითოეული ხაზი და გამოვიყენეთ რეგულარული გამოსახულება search() მხოლოდ იმ ხაზების ამოსაბეჭდათ, რომელიც შეიცავს სტრინგს 'From:' . ეს პროგრამა არ იყენებს რეგულარული გამოსახულების ნამდვილ ძალას. იგივე შედეგის მიღება შეგვეძლო line.find() გამოყენებით.
ძებნის სტრინგს როცა ამატებ სპეციალურ სიმბოლოებს, ხედავ რეგულარული გამოსახულების ძალას, რაც საშუალებას გაძლევს უფრო ზუსტად აკონტროლო თუ რომელი ხაზი ემთხვევა სტრინგს. რეგულარული გამოსახულებისთვის ამ სპეციალური სიმბოლოების დამატებით, საშუალება გვეძლევა გავაკეთოთ დახვეწილი თანხვედრა და ექსტრაქტი ძალიან პატარა კოდით.
                                                                                                                                        
მაგალითად, caret(, ) სიმბოლო რეგულარულ გამოსახულებაში გამოიყენება ხაზის დასაწყისის სანახავად. შეგვეძლო შეგვეცვალა აპლიკაცია და გვენახა მხოლოდ ის ხაზები, რომელიც იწყება From: - ით :

import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if re.search('ˆFrom:', line) :
print line
     


ეს არის ძალიან მარტივი მაგალითი, რომელიც გავაკეთეთ სტრინგ ბიბლიოთეკის მეთოდის startswith() - ის საპირწონედ.  მაგრამ ეს ემსახურება იმ მოსაზრების გაცნობას, რომ რეგულარული გამოსახულება შეიცავს სპეციალური მოქმედების სიმბოლოებს, რომელიც გვაძლევს მეტ კონტროლს თუ რა უნდა შეესაბამებოდეს რეგულარულ გამოსახულებას.

11.1 Character matching in regular expressions


არის სხვა სპეციალური სიმბოლოები, რაც საშუალებას გვაძლევს გავაკეთოთ უფრო ძლიერი რეგულარული გამოსახულებები. ყველაზე ხშირად გამოყენებული სპეციალური სიმბოლო არის წერტილის სიმბოლო, რომელიც შეესაბამება ნებისმიერ სიმბოლოს.
ქვემოთ მოყვანილ მაგალითში რეგულარული გამოსახულება “F..m:”  უნდა დაემთხვეს ამათგან ნებისმიერ სტრინგს “From:”, “Fxxm:”, “F12m:”, or “F!@m:” .  რეგულარულ გამოსახულებაში წერტილის სიმბოლო ემთხვევა ნებისმიერ სიმბოლოს.

import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if re.search('ˆF..m:', line) :
print line
ეს არის განსაკუთრებით ძლიერი, როდესაც კომბინირებულია უნართან, რომელიც მიუთითებს, რომ რეგულარულ გამოსახულებაში სიმბოლო შეიძლება განმეორდეს ნებისმიერი რაოდენობით  "*" ან "+" სიმბოლოების გამოყენებით. ეს სპეციალური სიმბოლოები ნიშნავს, რომ სტრინგის ძებნაში ერთი სიმბოლოს დამთხვევის ნაცვლად ვარსკვლავის სიმბოლოს შემთხვევაში ემთხვევა ნულჯერ არ მეტჯერ და  პლიუსის სიმბოლოს შემთხვევაში - ერთხელ ან მეტჯერ. ჩვენ შეგვიძლია კიდევ უფრო შევამჭიდროვოთ ხაზები რომელშიც დაემთხვა wild card სიმბოლოები:


import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if re.search('ˆFrom:.+@', line) :
print line




სტრინგის ძებნა 'ˆFrom:.+@' დაემთხვევა ხაზებს, რომელიც იწყება „From - ით“და მოყვება ერთი ან მეტი სიმბოლო „.+“, რომელსაც მოყვება ეთ(@) სიმბოლო. ეს დაემთხვევა შემდეგ ხაზს:

From: stephen.marquard @uct.ac.za

.+wildcard შეგიძლია განიხილო როგორც ორწერტილსა და ეთ - ს შორის ყველა სიმბოლოს გაფართოვებულ დამთხვევაზე.

From:.+ @

პლიუსის და ვარსკვლავის სიმბოლოებზე კარგი იქნება იფიქრო, როგორც „აბეზარზე“. მაგალითად, მომდევნო სტრინგი დამეთხვევა ბოლო ეთ ნიშანს სტრინგში as the “.+” pushes Outwards როგორც ნაჩვენებია ქვემოთ.

From: stephen.marquard@uct.ac.za, csev@umich.edu, and cwen @iupui.edu


სხვა სიმბოლოს დამატებით შესაძლებელია „უთხრა“ ვარსკვლავის ან პლიუსის ნიშანს, რომ არ იყოს ასეთი „ხარბი“. ხარბი ქცვის მოსაშორებლად ნახე დოკუმენტაცია.