Saturday, August 15, 2015

თავი 11,2



11.2 Extracting data using regular expressions

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

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
Return-Path: <postmaster@collab.sakaiproject.org>
for <source@collab.sakaiproject.org>;
Received: (from apache@localhost)
Author: stephen.marquard@uct.ac.za


არ არის საჭირო  კოდის დაწერა ხაზის ყოველი ტიპისთვის ან ყოველი ხაზის სხვა და  სხვა ნაირად დახლეჩვა  და დაჭრა. მომდევნო პროგრამა იყენებს findall()  - ს იმ ხაზების საპოვნელად, რომელსაც აქვს ფოსტის მისამართი და გამოაქვს ერთი ან მეტი მისამართი ყოველი ხაზიდან.

import re
s = 'Hello from csev@umich.edu to cwen@iupui.edu about the meeting @2PM'
lst = re.findall('\S+@\S+', s)
print lst


findall() მეთოდი ეძებს სტრინგს მეორე არგუმენტში და აბრუნებს ყველა იმ სტრინგის სიას, რომელიც ჰგავს ფოსტის მისამართს. ვიყენებთ ორსიმბოლოიან თანრიგს, რომელიც ემთხვევა არა-ცარიელ სიმბოლოს (\S).

პროგრამის ამონაბეჭდი უნდა იყოს:

['csev@umich.edu', 'cwen@iupui.edu']


ვეძებთ ქვესტრინგს, რომელსაც აქვს სულ მცირე ერთი სიმბოლო(არა ჰარი) და მოყვება ეთ ნიშანი, რომელსაც მოყვება სულ მცირე ერთი სიმბოლო(არა ჰარი). ასევე \S+ამთხვევს რაც შეიძლება მეტ სიმბოლოს(ამას ქვია „ხარბი“ დამთხვევა რეგულარულ გამოსახულებაში).
რეგულარული გამოსახულება დაემთხვა ორჯერ (csev@umich.edu და cwen@iupui.edu), მაგრამ არ დაემთხვა სტრინგი “@2PM”, იმიტომ რომ ეთ ნიშნამდე არ არის არა-ცარიელი სიმბოლო. შეგვიძლია ეს რეგულარული გამოსახულება გამოვიყენოთ პროგრამაში ფაილში ყველა ხაზის წასაკითხად და ყველაფრის ამოსაბეჭდად, რაც კი ფოსტის მისამართს გავს:

import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
x = re.findall('\S+@\S+', line)
if len(x) > 0 :
print x

წავიკითხეთ თითოეული ხაზი და ამოვიღეთ ყოველი ქვესტრინგი, რომელიც დაემთხვა რეგულარულ გამოსახულებას.  მას მერე რაც findall() აბრუნებს სიას, მარტივად ვამოწმებთ დაბრუნებულ სიაში ელემენტების რაოდენობა არის თუ არა ნულზე მეტი რომ ამოვბეჭდოთ ხაზები სადაც ვიპოვნეთ სულ მცირე ერთი ქვესტრინგი რომელიც გავს მეილის მისამართს.
პროგრამას თუ გავუშვებთ mbox.txt - ზე , მივიღებთ შემდეგ ამონაბეჭდს:

['wagnermr@iupui.edu']
['cwen@iupui.edu']
['<postmaster@collab.sakaiproject.org>']
['<200801032122.m03LMFo4005148@nakamura.uits.iupui.edu>']
['<source@collab.sakaiproject.org>;']
['<source@collab.sakaiproject.org>;']
['<source@collab.sakaiproject.org>;']
['apache@localhost)']
['source@collab.sakaiproject.org;']


ზოგიერთ მისამართს დასაწყისში ან ბოლოში აქვს ზედმეტი სიმბოლო „<“ ან „;“ . მოდი გამოვაცხადოთ, რომ დაინტერესებული ვართ სტრინგის მხოლოდ ისეთი ნაწილით, რომელიც იწყება და მთავრდე ასოთი ან ციფრით.

ამის გასაკეთებლად ვიყენებთ რეგულარული გამოსახულების  სხვა ფუნქციას. კვადრატული ფრჩხილები გამოყენებულია დაშვებული სიმბოლოების საჩვენებლად რომელსაც განვიხილავთ დასამთხვევად. ამ თვალსაზრისით \S ემთხვევა  „არა თეთრი ადგილის სიმბოლოებს “.  ხლა,  პირობები, რომლითაც სიმბოლოები  დაემთხვევა იქნება უფრო ზუსტი.
აქ არის ახალი რეგულარული გამოსახულება:

[a-zA-Z0-9]\S*@\S*[a-zA-Z]

ეს ცოტათი რთულია და შეგიძლია ნახო რატოა რეგულარული გამოსახულებები „სხვა ენა“.  რეგულარული გამოსახულების თარგმანი: ვეძებთ ქვესტრინგს, რომელიც იწყება პატარა ან დიდი ასოთი ან ციფრით „[a-zA-Z0-9]“ რასაც მოყვება ნული ან მეტი არა-ცარიელი სიმბოლო \S* , რასაც მოყვება ეთ ნიშანი, შემდეგ ნული ან მეტი არა-ცარიელი სიმბოლო „\S* , შემდეგ დიდ ან პატარა ასო. შენიშვნა: ჩვენ გადავერთეთ „+“ - იდან „*“ -ზე ნული ან მეტი არა-ცარიელი სიმბოლოს საჩვენებლად  მას შემდეგ, რაც [a-zA-Z0-9]“ უკვე არის ერთი არა-ცარიელი სიმბოლო. დაიმახსოვრე რომ  *“ ან „+“მაშინვე  მიმართავს  ერთ სიმბოლოს პლიუსის ან ვარსკვლავის მარცხნივ.
ამ გამოსახულებას ჩვენს პროგრამაში თუ გამოვიყენებთ, მონაცემები იქნება უფრო სუფთა:

import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
x = re.findall('[a-zA-Z0-9]\S*@\S*[a-zA-Z]', line)
if len(x) > 0 :
print x
...
['wagnermr@iupui.edu']
['cwen@iupui.edu']
['postmaster@collab.sakaiproject.org']
['200801032122.m03LMFo4005148@nakamura.uits.iupui.edu']
['source@collab.sakaiproject.org']
['source@collab.sakaiproject.org']
['source@collab.sakaiproject.org']
['apache@localhost']


შენიშვნა:  source@collab.sakaiproject.org - ის ხაზზე რეგულარულმა გამოსახულებამ ამოაგდო ორი ასო სტრინგის ბოლოში(„>;“).  ეს იმიტომ რომ როცა „[a-zA-Z]“ დავურთეთ რეგულარული გამოსახულების ბოლოს, ჩვენ ვითხოვთ, რომ რა სტრინგიც არ უნდა იპოვნოს რეგულარული გამოსახულების გამრჩევმა უნდა მთავრდებოდეს ასოთი. ასე რომ „sakaiproject.org - ის“ შემდეგ, როცა ხედავს „> - ს“, უბრალოდ ჩერდება ბოლო დამთხვეულ ასოზე.
შენიშვნა: პროგრამის ამონაბეჭდი არის პითონი სია, რასაც აქვს სტრინგი - როგორც სიაში ერთი ელემენტი.