[Powered by Google Translate] [Szeminárium: Pattern Matching reguláris kifejezésekkel]
[John Mussman-Harvard Egyetem]
[Ez CS50.-CS50.TV]
Oké. Nos, üdvözlök mindenkit. Ez CS50 2012.
A nevem John, és fogok beszélni ma a reguláris kifejezéseket.
A reguláris kifejezések elsősorban egy eszköz, hanem néha
A kód aktív lényegében megfelelő minták és vonósok.
Tehát itt egy internetes képregény a xkcd.
Ebben képregény van egy rejtélyes gyilkosság, ahol a gyilkos
követte valaki nyaralni, és a főszereplők kell
keresgélni 200 megabájt mailek keres egy címet.
És arról, hogy adja fel, ha valaki, aki tudja, hogy a reguláris kifejezések -
feltehetően a szuperhős - csap le és ír egy kódot
és megoldja a gyilkossági rejtély.
Így feltételezhetően az, hogy lesz valami, akkor felhatalmazott
után a szemináriumon.
Mi csak lesz tömör bevezetés a nyelv
és kapsz elég pénze, hogy menjen utána több forrást a saját.
>> Így néz ki a reguláris kifejezések alapvetően, mint ez.
Ez a reguláris kifejezés Ruby.
Ez nem igazán különbözik a különböző nyelveken.
Mi már csak a vágás kezdődik, és jelölje meg a reguláris kifejezést Ruby.
És ez egy reguláris kifejezés keresni e-mail cím mintát.
Tehát azt látjuk, az első bit keres bármilyen alfanumerikus karakter.
Ez azért van, mert e-mail címét gyakran meg kell kezdeni egy betű.
És akkor minden speciális karaktert, majd a @ szimbólumot.
És akkor ugyanaz a domain név.
És akkor a 2 és 4 karakter keresni a. Com,. Net, és így tovább.
Szóval ez egy másik példa a reguláris kifejezés.
Tehát reguláris kifejezések protokollok találni minták a szövegben.
Ők összehasonlítások, kiválasztott, és a csere.
Tehát egy harmadik példa megtalálni az összes telefonszámot végződő 54 egy könyvtárban.
Szóval mielőtt Dávid rip fel CS50 könyvtár tudtunk keresni
a minta, ahol van zárójelben, és 3 számot, akkor vége zárójel,
3. több számot, a kötőjel, 2 szám, majd a 54.
És ez lényegében, hogy hogyan jön létre a reguláris kifejezést keresni ezt.
>> Tehát vannak - tettünk néhány dolgot CS50, amelyek egy kicsit, mint
reguláris kifejezések, így - például - a dictionary.C fájlban
A helyesírás-ellenőrzés problémát meg lehet, hogy használt fscanf
olvasni egy szót a szótárban.
És láthatjuk a százalékos 45s keres egy sor 45 karakter.
Tehát ez valamivel, mint egy kezdetleges reguláris kifejezés.
És akkor bármilyen 45 karakter, amely illik a számlát ott
és vedd fel azt.
És akkor a második példa a legutóbbi webes programozási feladat
meg a disztribúció kódot php valójában van egy egyszerű reguláris kifejezés.
És ez az ember egyszerűen csak keres, hogy ellenőrizze, az internetes oldalt, hogy telt el
illeszkedik vagy a belépéssel vagy a kilépéssel regisztrálj. PHP.
És akkor vissza igaz vagy hamis alapuló reguláris kifejezések illesztése.
>> Szóval mikor reguláris kifejezés?
Miért van itt ma?
Szóval nem kívánja használni reguláris kifejezést, ha van valami, ami
ez a munka az Ön számára is könnyebben.
Így az XML és a HTML valóban nagyon bonyolult
írni reguláris kifejezések, mint látni fogjuk, egy kicsit.
Tehát vannak külön elemzők számára nyelven.
Azt is meg kell, hogy rendben van a kompromisszumokra, és a pontosság gyakran.
Ha megpróbálod - így látta a reguláris kifejezés egy e-mail cím,
de azt mondják, hogy volna egy adott e-mail címét, és fokozatosan a
reguláris kifejezés lehet, hogy egyre bonyolultabbak lesznek lett pontosabb.
Szóval ez lenne az egyik kompromisszum.
Meg kell bizonyosodni arról, hogy rendben van, hogy a reguláris kifejezés.
Ha pontosan tudja, mit keres akkor lehet, hogy több értelme van
, hogy az időt és írjon egy hatékonyabb elemző.
És végül van egy történelmi kérdés a rendszeresség
kifejezések és nyelvek.
A reguláris kifejezések valójában sokkal erősebb, mint a
reguláris kifejezések egy mondjuk egy formális értelemben.
>> Szóval nem akarom, hogy túl messzire megy a formális elmélet
de a legtöbb nyelv, amit kód valójában nem szabályos.
És ez az, amiért a reguláris kifejezések néha nem tekinthető minden biztonságos.
Tehát alapvetően van egy Chomsky hierarchia a nyelvek,
és reguláris kifejezések épülnek fel a szakszervezet, összefűzése,
és a Kleene csillag művelet látni fogjuk néhány perc alatt.
Ha érdekel, elvileg van elég sok folyik ott a motorháztető alatt.
>> Így a rövid története - csak a kontextus itt - rendszeres készletek jött
Az 1950-es években, és akkor volt egyszerű szerkesztők, hogy
beépített reguláris kifejezések - csak keres szálakat.
Grep - amely egy parancssori eszköz - egyike volt az első
nagyon népszerű eszközök beépített reguláris kifejezések a 1960-as években.
A 80-as években, Perl épült - egy programozási nyelv, amely
magában reguláris kifejezések nagyon jól.
Aztán újabban már volt Perl kompatibilis reguláris kifejezések
protokollok alapvetően más nyelveken használó sok ugyanazt a szintaxist.
Természetesen a legfontosabb esemény volt 2008-ban
ahol nem volt az első nemzeti reguláris kifejezések nap,
ami véleményem szerint június 1, ha szeretné ünnepelni ezt.
>> Ismét, csak egy kicsit több elmélet itt.
Tehát van egy pár különböző módon építésének reguláris kifejezések.
Egy egyszerű módja, hogy létrejöjjön a kifejezést, hogy fogsz
fut a szöveg értelmezéséhez - alapvetően építeni egy kis mini-program
elemzi darab egy húr, és látni, hogy "Ó, nem ez illeszkedik a reguláris kifejezés, vagy nem?"
Majd futtassa ezt.
Tehát, ha van egy kis reguláris kifejezés, ez valószínűleg
a leghatékonyabb módja annak, hogy csináld.
És akkor, ha - egy másik lehetőség az, hogy a rekonstruálására
kifejezés, ahogy megy, és ez a lehetőség szimulálni.
És ezek a korai kísérletek reguláris kifejezés algoritmusok
viszonylag egyszerű és viszonylag gyors, de nem volt egy nagy rugalmasságot.
Így, hogy még néhány dolgot, hogy fogunk nézni
Ma kellett tennie bonyolultabb reguláris kifejezés
implementációk, amelyek potenciálisan sokkal lassabb, így ez egy olyan dolog, hogy szem előtt tartani
Van még egy reguláris kifejezéseket DoS támadás változatos
hogy kihasználják a potenciál ezen újabb implementációja
reguláris kifejezések, hogy nagyon bonyolult.
És nagyjából ugyanabban az értelemben, hogy láttuk buffer overflow támadások,
Ön támadásokat, hogy a munkát azzal, hogy rekurzív hurkok
lerohanta a memóriakártyák.
És mellesleg Regexen egyik hivatalos többes reguláris kifejezés
analógia útján ökrök az angolszász.
>> Oké, a Python Library sokan itt személynek Mac,
így valóban húzni ezt a képernyőn.
A reguláris kifejezések vannak építve Python.
És így Python előtelepített Mac és interneten is elérhető ezen a linken.
Tehát, ha nézed lehet szüneteltetni, és győződjön meg arról, hogy a Python
ahogy játszunk itt.
Van egy kézi interneten, így ha csak írja Python a számítógép
látni fogja, hogy a verzió jön fel a terminál.
Szóval egy hivatkozást a kézikönyv 2. változat a Python és a puskát.
Van egy 3-as verzió a Python, de a Mac nem feltétlenül
jön, hogy előre.
Tehát nem igazán különbözik.
Oké, így néhány alapvető reguláris kifejezések Python.
>> Tehát itt én egy nagyon egyszerű kifejezést, így tettem Python import re
és aztán az eredmény re.search.
És a keresés tart 2 érveket.
Az első a reguláris kifejezés, a második pedig a szöveg
vagy zsinórt az elemezni kívánt.
Aztán nyomtatja ki a result.group.
Tehát ezek a 2 alapvető funkciókat fogunk látni ma
a tanulás reguláris kifejezéseket.
Tehát csak összeomlanak a reguláris kifejezés itt
h majd \ w, majd így m \ w csak elfogad bármilyen betű ott.
Tehát itt keresünk egy "h", majd egy másik betű
majd m, ezért itt lenne megfelelő sonka
az "Abraham Lincoln és sonkás szendvicset."
Ez annak az eredménye, hogy a csoport.
A másik dolog, amit tehetünk, mielőtt igénybe húrok szövegének Python.
Szóval azt hiszem, akkor megy előre, és húzza, hogy akár itt.
Python import re.
És ha én nem ugyanaz a dolog - mondjuk a szöveg,
"Ábrahám," hadd zoom - ott vagyunk.
Szövege, "Ábrahám eszik sonkát."
Oké, majd a result = re.search.
És akkor a kifejezés lehet h, és meg is teszem dot m.
Tehát pont csak úgy minden karakter, amely nem új sor, beleértve a számokat,
százalék jel, ilyesmi.
És akkor text - boom -, majd result.group-Ja.
Szóval ez csak, hogyan hajtsák végre az alapvető funkciókat itt.
Ha lenne egy szöveges gyűrű - az őrült szöveg - beleértve mondjuk sok osztásjeleknek
és vonósok belül és a dolgok, hogy is néz ki escape szekvenciák,
akkor érdemes használni a nyers szövegbevitel, hogy megbizonyosodjon arról, hogy elfogadják.
És ez csak úgy néz ki, mint ezt.
Tehát, ha kerestünk mindegyik ott kellene nem találtam semmit.
De ez hogyan is hajtják végre, mielőtt a sor
A reguláris kifejezés teszel az R betű.
>> Oké, hadd folyamatosan megy.
Rendben - így nézzük meg néhány ismétlődő minták itt.
Tehát az egyik dolog, amit akarok, hogy ismételje meg a dolgokat
ahogy keres a szövegben.
Tehát, hogy nem egy követ akárhány b - te ab *.
És akkor van egy sor más szabályok is.
És nézd mindezeket fel, én csak végig néhány
leggyakrabban használt is.
Tehát ab + egy követ bármely N 0-nál nagyobb a b.
ab? egy követ 0 vagy 1. A b.
N {ab} egy követ N b, majd így tovább.
Ha 2 szám a zárójelek van meghatározva egy sor
hogy lehet esetleg kiegyenlített.
Így fog kinézni egy pár ismétlődő mintákat egy perc alatt.
Tehát 2 dolgot kell szem előtt tartani, amikor ezeket a minta megfelelő eszközökkel itt.
Tehát mondjuk szeretnénk nézni a HM az "Abraham Lincoln teszi sonkás szendvicset."
Szóval megváltozott Abraham Lincoln nevét Ábrahámnak.
És most keresünk, ami által visszaadott keresési funkció,
és csak akkor tér vissza sonka ebben az esetben.
És ez, mert keresés csak természetesen azon a bal szélső sorban.
És reguláris kifejezések kivéve, ha másképpen is csinálni.
Ha akartuk, hogy megtalálja az összes van egy funkció, amely - megtalálja az összes.
Tehát, ami éppen néz ki, mint az összes = re.findall (h.m ", szöveg)
majd all.group ().
Minden gyárt mind sonka és a sonka, ebben az esetben mindkét húrok Ábrahám sonka.
Annak érdekében, hogy egy másik lehetőség.
>> Remek. A másik dolog, hogy tartsa szem előtt, hogy a reguláris kifejezések, hogy a legnagyobb intuitív.
Nézzük ezt a példát.
Mi volt, hogy a bal szélső keresést itt, aztán megpróbált egy nagyobb kereső
a Kleene csillag operátor.
Tehát, "Abraham Lincoln teszi sonkás szendvics", és én csak kaptam vissza
m ennek eredményeként.
Ennek oka az, hogy a hiba az volt, hogy tudtam volna akárhány
h azért van, mert nem adja meg semmit, hogy menjen be a H és m.
Az egyetlen példa, hogy ott volt, m - az egyetlen példa ott m is
és tetszőleges számú H éppen a húr m.
Aztán megpróbáltam újra, azt mondtam: "Rendben, térjünk a tényleges legnagyobb csoport itt."
És akkor én h. * M, hogy csak vissza tetszőleges számú karakter a H és m.
És ha csak most kezdik el, és gondolkodás, "Oké, ez jól
értem sonka, "valójában tart mindent a h Abraham Lincoln
egészen a végéig sonka.
Ez kapzsi, látja h - mindez más szöveg - m,
és ez az, amit úgy be
Ez különösen hallatlan - ez egy olyan funkció, mi is
meg mert nem mohó egyéb funkcióinak használata.
De ez az, amit meg kell szem előtt tartani, különösen
ha ránézünk HTML szöveget, ami az egyik oka annak, hogy
reguláris kifejezések nehéz HTML.
Mert ha van egy nyitott HTML tag, majd sok-sok dolgot a közepén
, majd néhány más HTML zárt tag sokkal később a programban,
éppen most ettem egy csomó HTML kód esetleg véletlenül.
>> Rendben - így több speciális karaktereket, mint sok más nyelven,
menekülni a perjel.
Így tudjuk használni a pont, hogy meg bármilyen karakter, kivéve egy új sort.
Tudjuk használni az escape w adja minden betű.
És értelemszerűen escape d minden egész - numerikus karakter.
Tudjuk meg - tudjuk használni zárójelben adja a kapcsolódó kifejezések.
Tehát ez elfogadná a, b, c.
És azt is meg, vagy lehetőséget vagy a vagy b.
Például - ha kerestek több lehetőség
zárójelben tudtuk használni a vagy az üzemeltető, mint -
úgyhogy menjünk vissza ezt a példát itt.
És most nézzük, hogy - menjünk vissza erre példa itt, majd
hogy ae - így ez vissza - Azt hiszem, ez még mindig Ábrahám.
Tehát ez - ha nem minden - nagyszerű.
Tehát hadd frissítse a szöveg itt.
"Abraham eszik sonkát, miközben hümmögés a -, míg szegés." Remek.
All. Remek. Most, hogy sonka, sonka, és a szegély.
Míg szegés - miközben dúdolt neki -, míg a szegély dúdolt neki. Remek.
Ugyanaz.
Most minden visszatér még csak sonka, sonka, és a szegély nélkül felvette a zúgás vagy az őt.
Nagy - Mi van, ha azt akartuk, hogy nézni sem, hogy - így is csinálni
őt, vagy - mi jön vissza, hogy a.
Oké - így - minden rendben - pozícióban is használható a kalap, vagy a dollár jel
pontosítani, hogy mit keres valamit, az elején vagy a végén egy string.
Vagy a start vagy a végén egy szót sem.
Ez az egyik módja, hogy használja ezt.
>> Oké - így hadd játék körül egy kicsit nagyobb szövegrészt.
Mondjuk ez a sor itt - ez a kijelentés itt.
A hatalom a reguláris kifejezés, hogy ők is meg mintákat
nem csak a fix karakterek.
Engedje meg, hogy - nevezzük ezt a blokkot.
Aztán fogja olvasni az összes, hogy in
És akkor van egy - tegyük all =, akkor mi van néhány dolog, amit lehet keresni itt nyereséges?
Tudtuk meg a kifejezést fül.
Nem túl érdekes. Ehhez mit szólsz? Meglátjuk, mi történik.
Adtam egy probléma.
Így tetszőleges számú dolog, mielőtt újra, meg minden.
Annak érdekében, hogy vissza kell adnia mindent a kezdetektől, hogy valamennyi, talán egy-két alkalommal.
És akkor itt van a hatalom reguláris kifejezések, hogy azok
Megadhatja minták nem csak karakter van itt.
Így egészen a végső re indult, a bal szélső, és kapzsi.
Lássuk, - mi mást lehetne keresni.
Azt hiszem, az egyik dolog, ha voltak kíváncsiak keresi a névmások ő és ő
akkor ellenőrizze, s egyenlő a 0 vagy 1
és a kifejezés is, és ez valószínűleg nem fog visszatérni -
Ó, azt hiszem, ő vissza, mert keresünk a hatalom, hogy a nap, itt van.
Próbáljuk meghatározzák, hogy ez, hogy jöjjön a kezdete valami.
Lássuk, hogy leesik.
Így nem tehetünk zsír, és nem kapunk semmit, mert ő és ő
nem fordul elő ez a kifejezés.
Remek. Oké - így hát a macska itt.
Így bonyolult minták hátrányosan érinti az agyban.
Szóval ez az, ezért reguláris kifejezéseket, hogy elkerüljék ezeket a kérdéseket.
>> Tehát itt van néhány egyéb hasznos mód lehet játszani körül.
Néztük keresés ma, de akkor is használhatja meccs, split, findall és csoportok.
Így egyéb jó dolog, amit tehetünk a reguláris kifejezések mellett csak
keres mintákat vesz mintát, és tartja a mérkőzések -
változója -, majd használja ezeket a kódban később.
Ez lehet igen hasznos. Más dolog, lehet, hogy számít.
Így tudjuk számolni a példa, hogy egy reguláris kifejezés minta,
és ez az, amit tudunk használni csoportokat.
És más közlekedési módok is is lehetséges.
Szóval csak azt szeretném, hogy beszéljünk egy kicsit többet a más módon lehet reguláris kifejezéseket.
>> Tehát az egyik fejlettebb alkalmazás a fuzzy matching.
Tehát, ha keres egy szöveget a kifejezést, Julius Caesar,
és látod, vagy Gaius Julius Caesar, vagy a név Julius Caesar más nyelveken,
akkor is szeretne hozzá némi súlyt ezeket az értékeket.
És ha elég közel van -, ha átmegy egy bizonyos küszöbértéket -, akkor akar
, hogy képes legyen fogadni Julius Caesar.
Tehát van egy pár különböző megvalósítások, hogy néhány más nyelven is.
Íme néhány további eszközök Regex Pal - egy hasznos kis alkalmazás online
ellenőrizze, hogy a reguláris kifejezések állnak-e.
Vannak önálló eszközök, amelyek segítségével futtatni az asztali
mint Ultra Pico, és csakúgy, mint csak a szakácskönyvek.
Tehát, ha csinálsz egy projekt, amely magában foglalja egy csomó reguláris kifejezések
valószínűleg ez a hely, hogy menjen kívül esnek a mai.
És akkor csak hogy egyfajta milyen gyakori, hogy
van grep a Unix, Perl beépített, és C van PCRE a C.
És akkor az összes többi nyelv is reguláris kifejezés csomagok
hogy működnek lényegében ugyanazt a szintaxist kaptunk egy kis ízelítőt a ma.
PHP, Java, Ruby, és így tovább.
>> Google Code Search valóban említésre méltó, hogy az egyik
viszonylag kevés program található, amely lehetővé teszi a nyilvános hozzáférést
az adatbázis reguláris kifejezések segítségével.
Tehát, ha megnézi a Google Code Search találsz kódot
ha keres egy példányát, hogy egy függvény lehet használni,
akkor a reguláris kifejezést találni ezt a funkciót használják mindenféle különböző esetben.
Lehet keresni fwrite, és akkor lehet nézni a zászló írni, olvasni
ha volna egy példát fwrite használják ebben az esetben.
Tehát ugyanaz a dolog ott, és itt van néhány hivatkozás.
Ez lesz elérhető online is, így lesz, ha előre
szeretné nézni Python, grep, Perl - csak azt, hogy egy kis ihletet
vagy ha azt szeretné, hogy inkább az elmélet itt van néhány jó leugranak helyeken.
Köszönöm szépen.
[CS50.TV]