Script nyelvek előadás - reguláris kifejezések - kivételkezelés
Reguláris kifejezések re modul használata (import re) - ”.” -- egy darab bármilyen karakter, kivéve '\n' ha a re.DOTALL (re.S) flag be van állítva '\n' is lehet Illeszkedés vizsgálat (a szöveg elejétől): - re.match(minta, szöveg, flag-ek) - re.match("a.m.", "almafa") == <_sre.SRE_Match object at ...> - re.match("a.m.", "alm\nfa") == None - re.match("a.m.", "alm\nfa", re.DOTALL)
Reguláris kifejezések Minta többszöri használata: - re.compile(minta, flag-ek) - r = re.compile("a.m.", re.S) -- <_sre.SRE_Pattern object at ...> - r.match("alm\nfa") == <_sre.SRE_Match object at ...> Megjegyzés: illesztés, nem keresés re.match("f.", "almafa") == None
Reguláris kifejezések Minta keresése a szövegben: - re.search(minta, szöveg, flag-ek) - re.search("f.", "almafa") == <_sre.SRE_Match object at ...> - re.search("f.", "almaf\n", re.S)
Reguláris kifejezések Eredmény felhasználása: - m = re.match("a.m.", "almafa") - m.group() == alma - m.start() == 0 - m.end() == 4 - m.span() == (0, 4) - m = re.search("f.", "almafa") - m.group() == fa - m..span() == (4, 6)
Reguláris kifejezések Összes illeszkedés: - re.findall("a.", "almafa") == ['al', 'af'] Iterálás: - it = re.finditer("a.", "almafa") - for m in it: print m.span() (0, 2) (3, 5) ⇨
Reguláris kifejezések Szétvágás: - re.split(";.", "Peter;;Miklos; Janos;:Pal") == ['Peter', 'Miklos', 'Janos', 'Pal'] - re.split("(;.)", "Peter;;Miklos; Janos;:Pal") == ['Peter', ';;', 'Miklos', '; ', 'Janos', ';:', 'Pal'] - re.split(";.", "Peter;;Miklos; Janos;:Pal",2) == ['Peter', 'Miklos', 'Janos;:Pal'] - re.split("-.", "Peter;;Miklos; Janos;:Pal") == ['Peter;;Miklos; Janos;:Pal']
Reguláris kifejezések - '*' -- a megelőző minta 0 vagy több ismétlődésére illeszkedik (maximális hosszúságban) - '+' -- a megelőző minta 1 vagy több ismétlődésére illeszkedik - '?' -- a megelőző minta 0 vagy 1 ismétlődésére illeszkedik - '*?' -- a megelőző minta 0 vagy több ismétlődésére illeszkedik (minimális hosszúságban) - '+?' -- a megelőző minta 1 vagy több ismétlődésére illeszkedik
Reguláris kifejezések - m = re.match("a.*a", "almafa") - m.group() == 'almafa' - m = re.match("a.*?a", "almafa") - m.group() == 'alma' - m = re.match("1(2.)+", "1242445") - m.group() == '12424' - m = re.match("1(2.)+?", "1242445") - m.group() == '124' - m = re.match("1(2.)*?", "1242445") - m.group() == '1'
Reguláris kifejezések - '{n}' -- a megelőző minta n db ismétlődésére illeszkedik - '{m,n}' -- a megelőző minta m és n közötti ismétlődésére illeszkedik (maximális hosszban) - '{m,n}?' -- a megelőző minta m és n közötti ismétlődésére illeszkedik (minimális hosszban)
Reguláris kifejezések - m = re.match("1(2.){1,4}", "1242445") - m.group() == '12424' - m = re.match("1(2.){1,4}?", "1242445") - m.group() == '124' - m = re.match("1(2.){2}", "12425345") - m.group() == '12425'
Reguláris kifejezések - '^' -- a szöveg elejére illeszkedik - '$' -- a szöveg végére illeszkedik - m = re.match(".+?a$","almafa") - m.group() == 'almafa' - re.findall("^a.","almafaalatt") == ['al'] Megjegyzés: a szöveg elejéről keres... - m = re.search(".*?a$","almafa") - m.group() == 'almafa'
Reguláris kifejezések Példaprogramok - regexp1.py
Reguláris kifejezések - '[ ]' -- karakterek halmazát jelöli - '[^ ]' -- komplementer halmaz - '\d' -- digitális karakterek [0-9] - '\D' -- nem digitális karakterek [^0-9] - '\w' -- alfanumerikus karakterek [a-zA-Z0-9_] - '\W' -- nem alfanumerikus karakterek [^a-zA-Z0-9_] - '\s' -- whitespace karakterek - '\S' -- nem whitespace karakterek
Reguláris kifejezések - m = re.search('[\d\-]+', "Kis Péter kisp@email.com +36-24-345-567") - m.group() == '36-24-345-567' - m = re.search('[^\w\s]+', "Kis Peter kisp@email.com +36-24-345-567") - m.group() == '@' - m = re.search('[^\w\s]+', "Kis Péter kisp@email.com +36-24-345-567") - m.group() == '\xc3\xa9' Megjegyzés: - 'é' == '\xc3\xa9'
Reguláris kifejezések - 'minta1|minta2|...|mintan' -- választás, balról jobbra értékeli ki - re.findall('a\w*|A\w*|Á\w*|á\w*', "alma Ákos körte Antal árpa Béla") == ['alma', '\xc3\x81kos', 'Antal', '\xc3\xa1rpa', 'a'] - m = re.search('\d+|[\d\-\+]+', "Kis Péter András tel: 06-1-234-5678") - m.group() == '06'
Reguláris kifejezések - '( )' -- csoportosítás, balról jobbra, kívülről befelé sorszámozva - m = re.match('[\w\s]+ email:((.+)@.+)\stel:\s([\d\-\+]*)', "Nagy Endre email:enagy@elte.hu tel: +36-1-234-5674") - m.group() == m.group(0) == 'Nagy Endre email:enagy@elte.hu tel: +36-1-234-5674' - m.group(1) == 'enagy@elte.hu' - m.group(2) == 'enagy' - m.group(3) == '+36-1-234-5674' - m.groups() == ('enagy@elte.hu', 'enagy', '+36-1-234-5674')
Reguláris kifejezések - '\szám' -- adott sorszámú csoportra hivatkozik - m = re.match(r'(\d+\.) .*\1: (\d+ pont)', "1. Nagy Tamás, 2. Kis Péter; 1.: 20 pont, 2.: 18 pont") - m.group(2) == '20 pont' Megjegyzés: „raw text” - 'valami\1' == 'valami\x01' - r'valami\1' == 'valami\\1'
Reguláris kifejezések - '(?P<név> )' -- névvel ellátott csoport létrehozása - '(?P=név)' -- az adott nevű csoportra illeszkedő minta - m=re.match('(?P<helyezes>\d+\.) .*(?P=helyezes): (\d+ pont)', "1. Nagy Tamás, 2. Kis Péter; 1.: 20 pont, 2.: 18 pont") - m.group(2) == '20 pont' - m.group('helyezes') == '1.'
Reguláris kifejezések - Csoportra hivatkozás helyettesítésben - re.sub("<H1>(.*)</H1>", r"\1", "<H1>title</H1>") == 'title' - re.sub("<H1>(?P<t>.*)</H1>", "\g<t>", "<H1>title</H1>")
Reguláris kifejezések Példaprogramok - regexp2.py - regexp3.py
Kivételkezelés - try: belső blokk except kivétel1: kivételkezelés1 except: default kivételkezelés else: else ág finally: finally ág (mindenképpen végrehajtódik)
Kivételkezelés Példaprogram - exception1.py
Kivételkezelés Néhány beépített hiba típus: - IndentationError - hibás indentálás (margó szabály) - IndexError - túlindexelés - IOError - I/O művelet hibája (pl. nem létező fájl) - NameError - nem létező névre (pl. változó) hivatkozás - SyntaxError - hibás szintaxis (pl. import-nál is) - TypeError - hibás paramétertípus (pl. „hello” + 5) - ValueError - nem megfelelő (típusú) érték - ZeroDivisionError - nullával osztás
Kivételkezelés - hiba kiváltása - raise NameError("Hiba leiras") - hiba paraméterek kezelése - except NameError as errorObj: ... - az errorObj-ba kerül a hiba objektum - errorObj.args --- a kiváltáskor megadott paraméterek
Kivételkezelés - saját hiba létrehozása - class MyError(Exception): pass - try: raise MyError(23) except MyError as x: print "Sajat hiba, kod:", x
Kivételkezelés - saját hiba létrehozása - class MyError2(Exception): def __init__(self, value): self.value = value def __str__(self): return "Kettes sajat hiba a kovetkezo koddal:" + str(self.value) - try: raise MyError2(23) except MyError2 as e: print e