Reguláris kifejezések Horváth Árpád <horvath.arpad.szfvar@gmail.com> 2017. március 9.
Vázlat Hol alkalmazhatunk reguláris kifejezéseket A reguláris kifejezések minimális nyelve Automatás feladatok Gyakorlati tudnivalók
Egy nyelv Melyik lehet? Melyikek hibásak? Hogyan ellen riznénk programmal? ABC-001 TRA-548 AAA-000-01 AAA- NEKEM-8 KISAPA-01 FERI-12 KISAPA-0122333
Reguláris kifejezések
Egy nyelv Benne van: ABC-001 AAA-000 talán, nem kukacoskodunk :-) TRA-548 FERI-12 NEKEM-8 EWING-1 Nincs benne: -01 AAA- KISAPA-01 KISAPA-0122333
Másik nyelv Melyik lehet? Melyikek hibásak? Hogyan ellen riznénk programmal? joci@csillagasz.at horvath.arpad@amk.uni-obuda.hu x_ipszilon@gmail.com very.common@example.gov bobebaba13@futrinka.mtv.hu bobe@baba13@futrinka.mtv.hu abc.example.com bobebaba13@futrinka.mtv. bobebaba13@futrinka..hu
Hol alkalmazhatunk reguláris kifejezéseket Vázlat Hol alkalmazhatunk reguláris kifejezéseket A reguláris kifejezések minimális nyelve Automatás feladatok Gyakorlati tudnivalók
Hol alkalmazhatunk reguláris kifejezéseket Mire jók a reguláris kifejezések A reguláris kifejezések a reguláris nyelvek tömör leírását adják. A reguláris kifejezések egy algoritmussal véges automatává alakítható, ami alapján készíthet olyan program vagy hardvereszköz, amely ellen rizni tud egy reguláris kifejezést. Ezzel az algoritmussal nem foglalkozunk, (az megtalálható a Bach-könyvben, illetve az átalakítás gyakorlolható a JFLAP programmal). Mi a reguláris kifejezések létrehozásával fogunk foglalkozni. Az ellen rzést más tárgyakban rábízzuk a programnyelvek kész eszközeire. A programnyelvek és az XML/HTML fájlok környezetfüggetlen nyelvének szintaktikai elemzése kívül esik a reguláris kifejezések hatókörén.
Hol alkalmazhatunk reguláris kifejezéseket Reguláris nyelvek, kifejezések és nyelvtanok ill. véges automaták kapcsolata reguláris kifejezés reguláris nyelv reguláris nyelvtan véges automata
Hol alkalmazhatunk reguláris kifejezéseket Reguláris nyelvek, kifejezések és nyelvtanok ill. véges automaták kapcsolata reguláris kifejezés tömör leírás reguláris nyelv szavak halmaza reguláris nyelvtan levezetési szabályok véges automata állapotgráf
Hol alkalmazhatunk reguláris kifejezéseket Hol találkozhatunk reguláris kifejezésekkel? Programnyelvek Van ahol a programnyelv része: perl, awk JavaScript PostgreSQL vagy standard könyvtárában benne van: C# Python
Hol alkalmazhatunk reguláris kifejezéseket És még hol találkozunk regexp-el? (regular expression = regexp) Ezekben kereshetünk /-rel: vim man less Firefox Parancsok, amelyekben használható: grep sed A django web-keretrendszer a kapott URL-eket reguláris kifejezésekkel hasonlítja össze, így d l el, mit csinál, milyen paraméterekkel.
A reguláris kifejezések minimális nyelve Vázlat Hol alkalmazhatunk reguláris kifejezéseket A reguláris kifejezések minimális nyelve Automatás feladatok Gyakorlati tudnivalók
A reguláris kifejezések minimális nyelve Az alábbiakban r, r1, r2 egy-egy érvényes reguláris kifejezést jelent. A reguláris kifejezések leírhatóak a következ pár szabály alkalmazásával: r* r-b l 0-ra vagy többre illeszkedik r1 r2 vagy r1-re, vagy r2-re illeszkedik (r) csoportosítás r1r2 összef zés Példák: kifejezés illeszkedik erre nem illeszkedik erre ab*a aa aba abbba ab*a (ab)*a a aba ababa ababababa ab*a abab (a A)lma Alma alma colo( u)r color colour
A reguláris kifejezések minimális nyelve Feladat Milyen reguláris kifejezés illik az alábbi szavakra? ea ema emma emmma... emmmmmmmma... A feladatokat követ dián megoldás következik.
A reguláris kifejezések minimális nyelve Megoldás Milyen reguláris kifejezés illik az alábbi szavakra? ea ema emma emmma... emmmmmmmma... Legkézenfekv bb megoldás: em*a
A reguláris kifejezések minimális nyelve Feladat Milyen reguláris kifejezés illik az alábbi szavakra? ema emma emmma... emmmmmmmma..., de ea nem A feladatokat követ dián megoldás következik.
A reguláris kifejezések minimális nyelve Megoldás ema emma emmma... emmmmmmmma..., de ea nem Legkézenfekv bb megoldás: emm*a
A reguláris kifejezések minimális nyelve Feladat Milyen reguláris kifejezés illik az alábbi szavakra? alma1 alma2 alma3 emma1 emma2 emma3 A feladatokat követ dián megoldás következik.
A reguláris kifejezések minimális nyelve Megoldás alma1 alma2 alma3 emma1 emma2 emma3 Két viszonylag kézenfekv megoldás is van: (al em)ma(1 2 3) vagy (alma emma)(1 2 3)
A reguláris kifejezések minimális nyelve Jelölésmódok A Bach Iván könyvben a választás jelölése +. Itt a reguláris kifejezések esetén gyakorlatban is használt jelölést használjuk. A többi jelölés egyezik az itteniekkel. A reguláris kifejezések gyakorlatában a + jel a *-hoz hasonló, de 1 vagy több el fordulást jelöl.
A reguláris kifejezések minimális nyelve Speciális jelentés levédése A * és jeleknek speciális jeletése van, de néha szükséges, hogy * vagy jelekre illesszünk. Ilyenkor általában a \ karaktert illesztjük a speciális jeletés karakter elé, hasonlóan, mint ahogy az újsort jelöljük a karakterláncok esetén (\n). Az egyes alkalmazások reguláris nyelvei eltérnek abban, hogy a levédett vagy a levédetlen alak jelenti a speciális jelentést. Ezek között az egyik véglet a Python nyelv re modulja, ahol általában a speciális jelentést nem kell levédeni, a másik véglet a Vim és a grep, ahol általában a speciális jelentést kell levédeni.
A reguláris kifejezések minimális nyelve A speciális jelentések levédése (folyt.) A * és a. (pont) jelöléseket egyik esetben sem kell levédeni a speciális jelentéshez (és más általam ismert programnyelvben sem). (A. tetsz leges karakterre illeszkedik.) A * és. karakterekre a \* és \. kifejezés illeszkedik. A \ (visszaper, backslash) karakterre a \\ reguláris kifejezés illeszkedik. Az további példákban a Python jelölésmódját mutatom be, a példamegoldáshoz azt kell tudni, és aszerint kell megoldani a feladatokat. A Python nyelvben a csoportosítás zárójelét nem kell levédeni, a \( és a \) illeszkedik a zárójelekre. Szintén nem kell levédeni a választás függ leges vonalát, tehát a \ a karakterre illeszkedik. A jelek, amelyeket le kell védeni, mert speciális jelentésük van *. \[]{}+?^$
A reguláris kifejezések minimális nyelve Feladat Hogyan illesztenénk olyan kifejezésre, amely 0 vagy több a-bet után egy *, majd egy vagy több b bet követ? M Megoldás jön! Lapozás el tt próbálja megoldani a feladatot!
A reguláris kifejezések minimális nyelve Megoldás Hogyan illesztenénk olyan kifejezésre, amely 0 vagy több a-bet után egy *, majd egy vagy több b bet követ? a*\*bb* vagy a*\*b+ utóbbi esetben eltér lehet, hogy a + elé kell-e \.
A reguláris kifejezések minimális nyelve Feladat Hogyan illeszthetünk olyan kifejezést, amelynél két bináris számjegy után. (pont) majd egy bináris számjegy következik? Pl: 01.1 10.0 11.1 M Megoldás jön! Lapozás el tt próbálja megoldani a feladatot!
A reguláris kifejezések minimális nyelve Megoldás Hogyan illeszthetünk olyan kifejezést, amelynél két bináris számjegy után. (pont) majd egy bináris számjegy következik? (0 1)(0 1)\.(0 1)
A reguláris kifejezések minimális nyelve Feladat Melyek illeszkednek az els reguláris kifejezésekre az azt követ szavak közül? a.*b accb a..b a.*b a**b a...b a*b* A.b a\.*b a...b a\.b a\..b a\ccb ab a.b a(ab)*b ab a(ab)))b aab aababb ababab aabababb (0 1 2)*(a b)* 0 1 2a b ab12 (21)(ba) 012ab 210ba ab012 012*ab* ( o O)buda( i) buda budai budai Obuda Obudai (Obudai) (o)buda(i) obuda )buda(i) \((0 1 2),(2 3)\) 2,3 \(2,2\) (0,1) (0,3 (1,3) ((1),(2)) (13) (2,3) (1,2)
A reguláris kifejezések minimális nyelve Megoldások Az egyes sorokból a következ ek helyesek csak: a.*b accb a..b a.*b a**b a...b a\.*b a...b ab a.b a(ab)*b ab aababb aabababb (0 1 2)*(a b)* 012ab 210ba ( o O)buda( i) buda budai Obuda Obudai obuda \((0 1 2),(2 3)\) (1,3) (2,3) (1,2) Zárthelyiben az el z höz hasonló kiválasztásos feladatok esetén a helytelenül aláhúzott változatok pontlevonással járnak.
Vázlat Hol alkalmazhatunk reguláris kifejezéseket A reguláris kifejezések minimális nyelve Automatás feladatok Gyakorlati tudnivalók
Miért kell b víteni? A reguláris kifejezések leírásához elegend a kezdetben említett négy lehet ség, mégis sok esetben elég körülményes azokkal felírni azt, amit illeszteni szeretnénk. Az egyik nehézség, amikor nagy számú karakter valamelyikére, például tetsz leges bet re, kell illeszkedni, az elég hosszan írható csak le. Ezért bevezetünk egy bet - vagy számintervallumok megadására is alkalmas halmazjelölést. Egy másik probléma, hogy az ismétlések számát nem olyan egyszer megadni. Hogyan adhatjuk meg azt, hogy a b bet egymás után legalább 2-szer, de maximum 7-szer szerepelhet? Például így: (bb bbb bbbb bbbbb bbbbbb bbbbbbb) vagy így bb( b bb bbb bbbb bbbbb) egyik sem kellemes.
Halmazjelölés A szögletes zárójel halmaz magadására alkalmas. Legegyszer bb formájában a felsorolt karakterek halmazát jelenti: [ilab@._]* illeszkedik az ali_baba@abba.lb szóra. (A már említett. (pont) karaktert itt nem kell levédeni, nincs értelme a speciális jelentésnek.) Megadhatunk szám és bet intervallumokat is, amennyiben a kezd és végkarakter közé jelet (köt jel) rakunk. Például a decimális számjegyeket, a(z ékezet nélküli) nagybet ket, illetve a kisbet ket a következ képpen adhatjuk meg: [0-9] [A-Z] [a-z]
Feladat Vajon hogyan adható meg egy nyolcas számrendszerbeli (oktális) számjegy az intervallumjelöléssel?
Feladat Vajon hogyan adható meg egy nyolcas számrendszerbeli (oktális) számjegy az intervallumjelöléssel? [0-7] Hogyan adható meg egy hexadecimális számjegy? (Egyszer ség kedvéért a bet k nagybet vel szerepeljenek: A, B, C, D, E, F!)
Feladat Vajon hogyan adható meg egy nyolcas számrendszerbeli (oktális) számjegy az intervallumjelöléssel? [0-7] Hogyan adható meg egy hexadecimális számjegy? (Egyszer ség kedvéért a bet k nagybet vel szerepeljenek: A, B, C, D, E, F!) ([0-9] [A-F]) Az intervallumok összevonhatóak egy szögletes zárójelbe szorosan egymás mellé írva: [0-9A-F]
Karakterhalmazok megadása Az el bbi jelölés tetsz leges karakterhalmazok megadására is alkalmas. Az [c0-3@] kifejezés a c, 0, 1, 2, 3 és @ mindegyikére illeszkedik. Ha egy halmaznak jelre (köt jel) is illeszkednie kell, akkor el re rakjuk a jelet, vagy védjük le. [-+03], +, 0 és 3 karakterekre illeszkedik [+0\-3] ez is [+0-3] +, 0, 1, 2 és 3 karakterekre illeszkedik
Feladat Egy intézetben két épület van, amelyeket K és F bet vel jelölnek. A termek sorszámozása mindegyik épületben 0-tól 99-ig történik. A termeket a következ képp adják meg K.00 K.01... K.99, F.00, F.01,... F.99. Írjon reguláris kifejezést, amely mindegyik teremnévre illeszkedik! M Megoldás jön! Lapozás el tt próbálja megoldani a feladatot!
Megoldás [FK]\.[0-9][0-9] Halmazjelölés nélkül: (F K)\.(0 1 2 3 4 5 6 7 8 9)(0 1 2 3 4 5 6 7 8 9)
Speciális jelölések karakterhalmazokra Néhány speciális halmaz jele látható az alábbi halmazban. Elég az els hármat tudni.. (pont) tetsz leges karakterre \d decimális karakterek [0-9] \w [0-9a-zA-Z_] \W az el bbi ellentettje \s [ \t\n\r\f\v] \S az el bbi ellentettje A \w tehát a változónevekben szerepl karaktereket tartalmazza a \s pedig a szóközt, a tabulátort és az újsort is magában foglaló whitespace karaktereket. Ezek halmazon belül is használhatóak, illetve a halmazjelölés szögletes zárójelén belül a pont elveszti speciális jelentését. Emiatt a [-.\w]+ illeszkedik az Django_10.My-Server.hu kifejezésre.
Ismétlések Az alábbi ismétlést jelent jeleket használhatjuk. n és m mindenhol természetes számot jelent. * 0 vagy több ismétl dés + 1 vagy több ismétl dés? 0 vagy 1 ismétl dés (van vagy nincs) {n} pontosan n ismétl dés {n,m} min. n, max. m ismétl dés {,m} max. m ismétl dés {n,} min. n ismétl dés
Feladat Melyek illeszkednek az els reguláris kifejezésekre az azt követ szavak közül? [A-Z]{2}\d{5} CA12345 12345CA C1B2345 XX111 AA54321 (1?\d{2} 2[0-4]\d 25[0-5]) 256 1222 255 00 1?44 244 133 (da){2,}dog dadog da{2,}dog dadadadog dadadog [.\w]+... al-hakim man_page re_howto.pdf index.html b[a-j]+ baba baj b bujj b[a] b[a]+ ba+ https? https? http https httpst httpsa \d+\.\d*[ee]-?\d+ 6.02e23 6e23 1.38E-23 1.2E-.5e2 1.E-6 2.333[eE]-?5 \(\d+\+\d+\) (33\+44) (5+6) (4-5) (33++44) (+22) (123+456)
Megoldás Csak ezek: [A-Z]{2}\d{5} CA12345 AA54321 (1?\d{2} 2[0-4]\d 25[0-5]) 255 00 244 133 (da){2,}dog dadadadog dadadog [.\w]+... man_page re_howto.pdf index.html b[a-j]+ baba baj https? http https \d+\.\d*[ee]-?\d+ 6.02e23 1.38E-23 1.E-6 \(\d+\+\d+\) (5+6) (123+456) A második kis hibával a 0 és 255 közötti számokat adja. A kis hiba, hogy a 00 01... 09 formájú számok is vannak közöttük. Kis munkával javítható: ([0-9] [1-9]\d 1\d{2} 2[0-4]\d 25[0-5])
Feladat Hogyan illeszthetünk a szokásos magyar rendszámokra? Az alábbiak arra jók, hogy lássuk mire lehet/érdemes reguláris kifejezést írni. Ennyire összetett feladat nem lesz számonkéréskor. Próbáljunk egy közelít reguláris kifejezést készíteni a következ kre: IP-címek e-mailek URL-ek M Megoldás jön! Lapozás el tt próbálja megoldani a feladatot!
Megoldások (nem mind) [A-Z]{3}-[0-9]{3} IP-k (több sorban, re.verbose mód) ( (1?\d\d 2[0-4]\d 25[0-5]) \. ){3} (1?\d\d 2[0-4]\d 25[0-5]) e-mailek (szóközökkel elválasztva, re.verbose mód) [-\w.]+ @ ([-\w]+\.)+ (hu de uk... com org...)
Zárójelpárosítás Lehet-e zárójelpárosításokat ellen rizni reguláris kifejezésekkel? Korlátozott számú kapcsos zárójelet hogyan ellen rizhetek?
Zárójelpárosítás Lehet-e zárójelpárosításokat ellen rizni reguláris kifejezésekkel? Korlátozott számú kapcsos zárójelet hogyan ellen rizhetek? Korlátlan számú kapcsos zárójelet hogyan ellen rizhetek?
Zárójelpárosítás Lehet-e zárójelpárosításokat ellen rizni reguláris kifejezésekkel? Korlátozott számú kapcsos zárójelet hogyan ellen rizhetek? Korlátlan számú kapcsos zárójelet hogyan ellen rizhetek? Korlátozott számú vegyes zárójelet hogyan ellen rizhetek?
Zárójelpárosítás Lehet-e zárójelpárosításokat ellen rizni reguláris kifejezésekkel? Korlátozott számú kapcsos zárójelpár: Pl. max 2 darab egymásba ágyazott, azaz {{}} vagy {} vagy ε. ({({})?})? (átláthatóság kedvéért a kapcsos zárójelek levédését elhagytam). Háromnál sorrendek {}{}{} {{}{}} {{{}}}
Zárójelpárosítás Lehet-e zárójelpárosításokat ellen rizni reguláris kifejezésekkel? Korlátozott számú kapcsos zárójelpár: Pl. max 2 darab egymásba ágyazott, azaz {{}} vagy {} vagy ε. ({({})?})? (átláthatóság kedvéért a kapcsos zárójelek levédését elhagytam). Háromnál sorrendek {}{}{} {{}{}} {{{}}} Korlátlan számú kapcsos zárójelpár: A zárójelezések nyelve környezetfüggetlen nyelv, nem fér bele a regulárisba nincs hozzá reguláris kifejezés.
Zárójelpárosítás Lehet-e zárójelpárosításokat ellen rizni reguláris kifejezésekkel? Korlátozott számú kapcsos zárójelpár: Pl. max 2 darab egymásba ágyazott, azaz {{}} vagy {} vagy ε. ({({})?})? (átláthatóság kedvéért a kapcsos zárójelek levédését elhagytam). Háromnál sorrendek {}{}{} {{}{}} {{{}}} Korlátlan számú kapcsos zárójelpár: A zárójelezések nyelve környezetfüggetlen nyelv, nem fér bele a regulárisba nincs hozzá reguláris kifejezés. Korlátozott számú vegyes zárójelpár: Nagyon bonyolult. Ismerni kell a lehetséges sorrendeket.
Zárójelpárosítás Lehet-e zárójelpárosításokat ellen rizni reguláris kifejezésekkel? Korlátozott számú kapcsos zárójelpár: Pl. max 2 darab egymásba ágyazott, azaz {{}} vagy {} vagy ε. ({({})?})? (átláthatóság kedvéért a kapcsos zárójelek levédését elhagytam). Háromnál sorrendek {}{}{} {{}{}} {{{}}} Korlátlan számú kapcsos zárójelpár: A zárójelezések nyelve környezetfüggetlen nyelv, nem fér bele a regulárisba nincs hozzá reguláris kifejezés. Korlátozott számú vegyes zárójelpár: Nagyon bonyolult. Ismerni kell a lehetséges sorrendeket. Veremautomatával egyszer lesz mindegyik.
Az elméleti rész összefoglalója A reguláris kifejezések tömör leírását adják a reguláris nyelveknek.
Az elméleti rész összefoglalója A reguláris kifejezések tömör leírását adják a reguláris nyelveknek. Alkalmasak
Az elméleti rész összefoglalója A reguláris kifejezések tömör leírását adják a reguláris nyelveknek. Alkalmasak számunkra érdekes adatok megkeresésére (grep), cseréjére (sed, vim),
Az elméleti rész összefoglalója A reguláris kifejezések tömör leírását adják a reguláris nyelveknek. Alkalmasak számunkra érdekes adatok megkeresésére (grep), cseréjére (sed, vim), hibás alakú adatok kisz résére (validálás).
Az elméleti rész összefoglalója A reguláris kifejezések tömör leírását adják a reguláris nyelveknek. Alkalmasak számunkra érdekes adatok megkeresésére (grep), cseréjére (sed, vim), hibás alakú adatok kisz résére (validálás). Tömör jelölések karakterhalmazokra és ismétlésre.
Az elméleti rész összefoglalója A reguláris kifejezések tömör leírását adják a reguláris nyelveknek. Alkalmasak számunkra érdekes adatok megkeresésére (grep), cseréjére (sed, vim), hibás alakú adatok kisz résére (validálás). Tömör jelölések karakterhalmazokra és ismétlésre. Reguláris nyelveket adnak meg programok szintaktikai elemzésre nem alkalmasak.
Az elméleti rész összefoglalója A reguláris kifejezések tömör leírását adják a reguláris nyelveknek. Alkalmasak számunkra érdekes adatok megkeresésére (grep), cseréjére (sed, vim), hibás alakú adatok kisz résére (validálás). Tömör jelölések karakterhalmazokra és ismétlésre. Reguláris nyelveket adnak meg programok szintaktikai elemzésre nem alkalmasak. Zárójelpárosítás ellen rzésére korlátozottan alkalmas.
Mikkel foglalkoztunk eddig? Összetev k és kapcsolatok El ször az összetev k. kifejezés
Mikkel foglalkoztunk eddig? Összetev k és kapcsolatok El ször az összetev k. reguláris kifejezés
Mikkel foglalkoztunk eddig? Összetev k és kapcsolatok El ször az összetev k. reguláris kifejezés reguláris nyelv
Mikkel foglalkoztunk eddig? Összetev k és kapcsolatok El ször az összetev k. reguláris kifejezés reguláris nyelv reguláris nyelvtan
Mikkel foglalkoztunk eddig? Összetev k és kapcsolatok El ször az összetev k. reguláris kifejezés reguláris nyelv reguláris nyelvtan véges automata
Mikkel foglalkoztunk eddig? Összetev k és kapcsolatok Mindhárom egyértelm en meghatározza a nyelvet. Milyen igéket használunk az egyes esetekben? reguláris kifejezés reguláris nyelv reguláris nyelvtan det. véges automata
Mikkel foglalkoztunk eddig? Összetev k és kapcsolatok Mindhárom egyértelm en meghatározza a nyelvet. Milyen igéket használunk az egyes esetekben? reguláris kifejezés generálja reguláris nyelv reguláris nyelvtan det. véges automata
Mikkel foglalkoztunk eddig? Összetev k és kapcsolatok Mindhárom egyértelm en meghatározza a nyelvet. Milyen igéket használunk az egyes esetekben? reguláris kifejezés reguláris nyelv generálja felismeri reguláris nyelvtan det. véges automata
Mikkel foglalkoztunk eddig? Összetev k és kapcsolatok reguláris kifejezés illeszkedik a szavaira reguláris nyelv generálja felismeri reguláris nyelvtan det. véges automata Nézzünk pár feladatot a véges automaták és reguláris kifejezések kapcsolatára.
Automatás feladatok Vázlat Hol alkalmazhatunk reguláris kifejezéseket A reguláris kifejezések minimális nyelve Automatás feladatok Gyakorlati tudnivalók
Automatás feladatok Feladat Milyen reguláris kifejezéssel írható le az alábbi véges automata által felismert nyelv? Írjuk le b vítetlen reguláris kifejezéssel és tömörebben a b vített reguláris kifejezés használatával! b a b q 0 q 1 q 2 a a Írjuk le a nyelvet halmazjelöléssel is! b M Megoldás jön! Lapozás el tt próbálja megoldani a feladatot!
Automatás feladatok Megoldás b*aa*b(a b)* vagy b*a+b[ab]* Az els megoldás nem használja a b vített nyelvet. L = {b i a j bw i 0, j > 0, w {a, b} }
Automatás feladatok Feladat Milyen reguláris kifejezéssel írható le az alábbi véges automata által felismert nyelv? Használhatja a b vített reguláris kifejezést! a c q 0 q 1 q 2 b c b q 3 Írjuk le a nyelvet halmazjelöléssel is! (Létrehozhatja a nyelvtant is, ami ugyanazt a nyelvet generálja, amit az automata felismer.) M Megoldás jön! Lapozás el tt próbálja megoldani a feladatot!
Automatás feladatok Megoldás (ab+ ab*c+ ) esetleg (ab*(b c+) ) Az els változat három függ leges vonallal elválasztott tagból áll: az els tag, amikor a B-be érek, a második, amikor a C-be érek, a harmadik amikor S-ben maradok üres szóval. Ugyanebben a sorrendben szerepelnek az alábbi halmazok, amelyeknek az unióját vesszük. L = {ab i i > 0} {ab i c j i 0, j > 0} {ε}
Automatás feladatok Feladat Rajzolja le olyan véges automaták állapotgráfjait, amely az alábbi reguláris kifejezések által megadott nyelvet ismeri fel! ab*c 0(12* 1+) a(b*c a+) ez nehezebb, ilyen nehéz nem lesz. M Megoldás jön! Lapozás el tt próbálja megoldani a feladatot!
Automatás feladatok Megoldás ab*c legkézenfekv bb megoldása: b a c q 0 q 1 q 2 0(12* 1+) egy lehetséges megoldása: 0 1 q 0 q 1 q 2 1 1 q 3 2
Automatás feladatok Reguláris kifejezésb l véges automata A reguláris kifejezések illesztéséhez nem ötletszer megoldások, hanem algoritmusok szükségesek. Az, hogy bármely reguláris kifejezés esetén meg tudjuk alkotni a véges automatát, amellyel meg tudjuk vizsgálni az egyes szavakat. Van erre algoritmus, de mi nem tanuljuk. (A Bach-könyvben vagy máshol megnézheti, aki akarja, és a JFLAP-pel gyakorolhatja, de számunkra nem szükséges.)
Gyakorlati tudnivalók Vázlat Hol alkalmazhatunk reguláris kifejezéseket A reguláris kifejezések minimális nyelve Automatás feladatok Gyakorlati tudnivalók
Gyakorlati tudnivalók Mihez szükséges? A további gyakorlati tudnivalóak nem szükségesek a Formális nyelvek feladatainak a megoldásához, hasznosak viszont a Linux alkalmazása kurzushoz, mivel a grep és a django használatakor (URL-értelmezés, bevitt adatok ellen rzése=validálása) is szükséges dolgok vannak hátra. Hasznos továbbá, ha valamikor a Pythonban saját programot szeretnénk írni, ami reguláris kifejezéseket használ.
Gyakorlati tudnivalók A sor eleje és vége A sor elejére a ^ (kalap) a végére a $ karakterek illeszkednek. Ha például a re.search függvénnyel keresünk, akkor az "aba" kifejezés illeszkedni fog az "Alabama" karakterláncra, annak aba részére. A "^aba" nem fog illeszkedni rá, de az "abama" és "abakusz" karakterláncra igen. A "^aba$" egyedül az "aba" karakterláncra fog illeszkedni. A Formális nyelvek rész feladatai teljes illeszkedést feltételeztek, mintha minden kifejezés elején ott lenne a ^ és a végén a $. Ez a megszokott mód az elméleti tárgyalások során, például a Bach Iván könyvében is, ha például egy nyelvet reguláris kifejezéssel írunk le.
Gyakorlati tudnivalók A nyers karakterláncok és a b írásmód A Python nyelv re modulja képes reguláris kifejezéseket kezelni. Ha r bet t írunk a karakterlánc elé, a \ nem viselkedik speciális karakterként könnyebben írhatunk reguláris kifejezéseket. A re.verbose paraméterrel sorokra bonthatjuk, és megjegyzésekkel láthatjuk el a reguláris kifejezéseket.
Gyakorlati tudnivalók Példa az r"" és a re.verbose használatára # r nélkül re.search("\\d+\\.\\d*", "123.6") # r-rel re.search(r"\d+\.\d*", "123.6") # r-rel és re.verbose-zel re.search(r""" \d+ # egész rész \. # tizedes pont \d* # törtrész """, "123.6", re.verbose)
Gyakorlati tudnivalók Python és Vim összehasonlítása A speciális jelentést: egyikben sem kell levédeni:. (pont), *, [] ^ $ \ csak Vimben kell levédeni: ( ) {? +
Gyakorlati tudnivalók Dokumentációk A reguláris kifejezések az itt leírtaknál nagyobb mélységgel rendelkeznek mind a Python nyelvben, mind a Vim szövegszerkeszt ben. A reguláris kifejezések Pythonbeli használatáról a Python dokumentációk között a Regular Expression HOWTO (a Python HOWTOs részben) és az re modul dokumentációja (a Library Reference részben) ad jó leírást. A reguláris kifejezések Vimbeli használatáról a :help regexp parancssal lehet többet megtudni. Lásd még: regexp_vim.txt