[Powered by Google Translate] [Seminar: Pattern Matching me shprehje të rregullta]
[Gjoni Mussman-Universiteti i Harvardit]
[Kjo është CS50.-CS50.TV]
Mirë. E pra, të mirëpritur të gjithë. Kjo është CS50 2012.
Emri im është John, dhe unë do të flasim sot rreth shprehje të rregullta.
Shprehjet e rregullta është kryesisht një mjet, por edhe përdorur ndonjëherë
në kod në mënyrë aktive në thelb ndeshjen modele dhe vargjet.
Kështu që këtu është një komik nga web RockSonte.
Në këtë komik ekziston një mister vrasje ku ka vrasës
pasuar dikush mbi pushim, dhe protagonistët duhet te
kërkoni përmes 200 megabajt e-mail në kërkim për një adresë.
Dhe ata janë gati të heqin dorë kur dikush që e di shprehje të rregullta -
me sa duket një superhero - sulet poshtë dhe shkruan disa kodin
dhe zgjidh misterin vrasje.
Pra, duket se do të jetë diçka që ju do të fuqizohet për të bërë
pas këtij seminari.
Ne jemi vetëm duke shkuar për të siguruar një hyrje konçize për gjuhën
dhe do t'ju japë mundësi të mjaftueshme për të shkuar pas më shumë burime në tuaj.
>> Pra, shprehjet e rregullta duken në thelb si kjo.
Kjo është një shprehje e rregullt në Ruby.
Kjo nuk është tmerrësisht i ndryshëm në të gjithë gjuhët.
Ne kemi vetëm mbi godet për të filluar dhe të shënojë shprehjen e rregullt në Ruby.
Dhe kjo është një shprehje e rregullt për të kërkuar në adresën model email.
Pra, ne shohim në pak pare duket për ndonjë karakter alfanumerike.
Kjo është për shkak se adresat e-mail shpesh duhet të fillojë me një karakter alfabetik.
Dhe pastaj çdo karakter të veçantë pasohet me simbolin @.
Dhe pastaj e njëjta gjë për emrin e domain.
Dhe pastaj në mes të 2 dhe 4 karaktere për të kërkuar com.,. Net, dhe kështu me radhë.
Kështu që është një tjetër shembull i shprehjes rregullt.
Pra, shprehjet e rregullta janë protokollet për gjetjen e patters në tekst.
Ata bëjnë krahasime, zgjedhje, dhe zëvendësimet.
Pra, një shembull i tretë është gjetur të gjitha numrat e telefonit mbaron në 54 në një directory.
Pra, para se të rips David up directory CS50 ne mund të kërkoni për
një model ku ne kemi kllapa atëherë 3 numra pastaj përfundojnë parantezë,
3 më shumë numra, një dash, 2 numra, dhe pastaj 54.
Dhe kjo do të jetë në thelb se si kemi ardhur deri me një shprehje të rregullta për të kërkuar për atë.
>> Pra, ka - ne kemi bërë disa gjëra në CS50 që janë pak si
shprehje të rregullta, kështu që - për shembull - në dosjen dictionary.C
për të vendosur spell check problem që ju mund të keni përdorur fscanf
për të lexuar në një fjalë nga fjalori.
Dhe ju mund të shihni 45s përqindja është duke kërkuar për një varg prej 45 karaktereve.
Pra, kjo është disi si një shprehje rudimentare rregullt.
Dhe ju mund të ketë ndonjë 45 karaktere që përshtaten faturë në atje
dhe marr ato ide.
Dhe pastaj shembulli i dytë në problemin e programimit më të fundit të internetit
përcaktuar në kodin distro për PHP ne fakt kemi një shprehje e thjeshtë të rregullt.
Dhe kjo është vetëm thjesht në kërkim të kontrolloni nëse faqja web që është kaluar në
përputhet ose login logout ose regjistrohuni. PHP.
Dhe pastaj kthehen e vërtetë apo e rreme bazuar në atë përputhen rregullt shprehjes.
>> Pra, kur ju përdorni shprehje e rregullt?
Pse jeni sot këtu?
Pra, ju nuk dëshironi të përdorni shprehje të rregullta, kur ka diçka që
bën punë për ju edhe më lehtë.
Pra, XML dhe HTML në të vërtetë janë mjaft të ndërlikuar
për të shkruar shprehje të rregullta për të siç do të shohim në pak.
Pra, ka Parsers dedikuara për këto gjuhë.
Ju gjithashtu duhet të jetë në rregull me të humbura të tregtisë dhe saktësisë shpesh.
Nëse jeni duke u përpjekur - kështu që ne pamë një shprehje e rregullt për një adresë email-i,
por thonë se ju të kërkuar një adresë email të veçantë dhe gradualisht
shprehje e rregullt mund të bëhet më komplekse si ajo u bë më e saktë.
Kështu që do të jetë një tregti off.
Ju duhet të jetë i sigurt që ju jeni duke bërë në rregull me shprehje të rregullta.
Nëse ju e dini saktësisht çfarë ju jeni duke kërkuar për të ajo mund të bëjë më shumë kuptim
për të vënë në kohë dhe të shkruani një parser më efektive.
Dhe në fund nuk është një çështje historike me rregullsinë
e shprehjeve dhe gjuhëve.
Shprehjet e rregullta në të vërtetë janë shumë më të fuqishme se
shprehje të rregullta në thonë se në një kuptim formal.
>> Kështu që unë nuk dua të shkoj shumë larg në teorinë formal,
por shumicën e gjuhëve që ne kod në të vërtetë nuk janë të rregullta.
Dhe kjo është arsyeja pse shprehje të rregullta ndonjëherë nuk janë konsideruar të sigurt që të gjithë.
Pra, në thelb ekziston një hierarki Chomsky për gjuhët,
dhe shprehje të rregullta janë ndërtuar duke përdorur bashkim, varg,
dhe operacionin yll Kleene që ne do të shohim në pak minuta.
Nëse jeni të interesuar në teori nuk është mjaft shumë ndodh atje nën kapuç.
>> Pra, një histori e shkurtër - vetëm për kontekstin këtu - grupe të rregullta doli
në vitet 1950, dhe pastaj kemi pasur redaktorët thjeshtë që
inkorporuar shprehje të rregullta - vetëm në kërkim për vargjet.
Grep - cila është një linjë komande mjet - ishte një nga të parë
mjete shumë të njohura që të inkorporuara shprehje të rregullta në 1960.
Në vitet '80, Perl është ndërtuar - është një gjuhë programimi që
inkorporon shprehje të rregullta shumë të dukshëm.
Dhe pastaj më shumë kohët e fundit ne kemi pasur Perl shprehje compatible rregullt
protokollet thelb në gjuhë të tjera që përdorin shumë i sintaksës njëjtë.
Natyrisht ngjarja më e rëndësishme ishte në vitin 2008
ku kishte parë Kombëtare rregullt Shprehjet Dita,
të cilën unë besoj se është data 1 nqs ju doni për të festuar këtë.
>> Teoria Përsëri, vetëm pak më shumë këtu.
Pra, ka disa mënyra të ndryshme të ndërtimit shprehje të rregullta.
Një mënyrë e thjeshtë është për të ndërtuar shprehjen që ju jeni duke shkuar për të
drejtuar në vargun e interpretojnë - në thelb të ndërtuar një të vogël mini-program që
do të analizojnë copa të një varg dhe të shohim, "Oh, kjo nuk i përshtatet shprehjen e rregullt apo jo?"
Dhe pastaj të drejtuar atë.
Pra, nëse ju keni një shprehje shumë të vogël të rregullt, kjo është ndoshta
mënyra më efikase për të bërë atë.
Dhe pastaj, nëse ju - një tjetër opsion është për të mbajtur rindërtimin e
shprehje si ju shkoni, dhe kjo është mundësia simulojnë.
Dhe këto përpjekje të hershme në algoritme shprehje të rregullta ishin
relativisht e thjeshtë dhe relativisht të shpejtë, por nuk kanë një shumë fleksibilitet.
Pra, për të bërë edhe disa nga gjërat që ne do të shikojmë në
sot ne kemi pasur të bëjmë shprehjen e më komplekse të rregullt
Implementimi që janë potencialisht shumë më i ngadalshëm, kështu që është diçka që të mbajnë në mend
Ka gjithashtu një shprehje e rregullt mohimi i sulmit shumëllojshmëri
që të shfrytëzojnë potencialin për këto implementime të reja të
shprehje të rregullta për të bërë shumë e ndërlikuar.
Dhe në shumë kuptim të njëjtë që e pamë në sulmet e del nga shtrati tampon,
ju keni sulmet që punojnë duke bërë sythe gjithkund rekursive që
muar kapacitetin e kujtesës.
Dhe nga rruga Regexen është një nga plurals zyrtare të rregullt shprehjes
në analogji me demat në anglo-sakson.
>> Mirë, kështu që Biblioteka Python shumë prej jush këtu në personin kanë Macs,
kështu që ju në fakt mund të tërheqë këtë deri në ekranin tuaj.
Shprehjet e rregullta janë ndërtuar në Python.
Dhe kështu Python është preloaded në Macs dhe gjithashtu në dispozicion online në këtë link.
Pra, nëse ju jeni të shikuar ju mund të pauzë dhe sigurohuni që ju keni Python
si ne të luajnë rreth këtu.
Nuk është një manual në internet, kështu që nëse ju vetëm shkruani Python në kompjuterin tuaj
ju do të shihni se versioni vjen deri në terminal.
Kështu që kam dhënë një lidhje për të manualit për versionin 2 të Python, si dhe një fletë të mashtrojnë.
Nuk është një Version 3 e Python, por Mac juaj nuk domosdoshmërisht
që vijnë me preloaded.
Pra, nuk është tmerrësisht i ndryshëm.
Mirë, kështu që disa nga bazat e përdorur shprehje të rregullta në Python.
>> Kështu që këtu unë përdorur një shprehje shumë të thjeshtë, kështu që unë e bëri Re Python import
dhe pastaj mori rezultatin e re.search.
Dhe kërko merr 2 argumente.
E para është shprehja e rregullt, dhe i dyti eshte tekst
ose string ju dëshironi për të analizuar.
Dhe atëherë unë shtypur nga result.group.
Pra, këto janë 2 funksionet themelore që ne do të shohim sot
në të mësuar në lidhje me shprehje të rregullta.
Pra, vetëm të thyer kjo shprehje e rregullt këtu
h dhe pastaj \ w dhe pastaj kështu m \ w vetëm pranon ndonjë karakter alfabetik në atje.
Pra, këtu ne jemi duke kërkuar për një "H" dhe pastaj një tjetër karakter alfabetik
dhe pastaj m, kështu që këtu se do të përputhen me proshutë
në "Abraham Lincoln proshutë dhe sanduiçe."
Ky është rezultati i atij grupi.
Një tjetër gjë që ne mund të bëjmë është të përdorni vargjet tona para se të tekstit në Python.
Kështu që unë mendoj se unë do të shkoj përpara dhe të tërheqë atë deri këtu.
Re Python importit.
Dhe në qoftë se unë do të bëjë të njëjtën gjë - le të themi tekst është,
"Abrahami," le të zoom in - ne do të shkojmë atje.
Teksti është: "Abraham ha proshutë."
Mirë, dhe pastaj të rezultojë = re.search.
Dhe pastaj shprehje ynë mund të jetë h, dhe pastaj unë do të bëj dot m.
Pra, vetëm merr dot asnjë karakter që nuk është një linjë e re duke përfshirë numrat,
Shenjat përqindje, diçka të tillë.
Dhe pastaj Teksti - boom - dhe pastaj result.group--po.
Pra, kjo është vetëm se si për të zbatuar funksionet bazë këtu.
Nëse do të kishim një unazë tekst që - që teksti i çmendur - të përfshira thonë se shumë e godet mbrapa
dhe vargjet brenda dhe gjërat që mund të duken si sekuenca të shpëtuar,
atëherë ne ndoshta dëshironi të përdorni të dhëna të papërpunuara tekst për t'u siguruar se është pranuar.
Dhe kjo thjesht duket si kjo.
Pra, në qoftë se ne ishim duke kërkuar për secilin prej tyre në atje ne nuk duhet të gjejnë asgjë.
Por kjo është se si ju do të zbatojë atë, vetëm para se vargu i
shprehje e rregullt ju vënë r letër.
>> Mirë, kështu që le të do të mbajë.
Të gjithë të drejtë - kështu që le të shohim në një çift modelet e përsëritura këtu.
Pra, një gjë që ju doni të bëni është të përsëris gjëra
si ju jeni në kërkim përmes tekstit.
Pra, për të bërë një pasuar nga ndonjë numër i B - ju bëni * ab.
Dhe pastaj ka një seri rregullash të tjera.
Dhe ju mund të shikoni të gjitha këto ngrihen, unë vetëm do të drejtuar përmes disa nga
më të përdorura zakonisht ato.
Pra ab + është një pasohet nga ndonjë N madhe se 0 të b.
ab? eshte nje pasuar nga 0 ose 1; b.
ab {N} eshte nje pasuar nga I I B, dhe pastaj kështu on.
Nëse ju keni 2 numra në formatimin e teksteve kaçurrel ju jeni duke specifikuar një gamë të
që mund të jetë ndoshta përputhet.
Pra, ne do të shikojmë më shumë në një çift modele të përsëritura në një minutë.
Pra 2 gjëra për të mbajtur në mendje kur duke përdorur këto mjete model përputhen këtu.
Pra, thonë se ne duam të shikojmë në hm e "Abraham Lincoln bën sanduiçe proshutë."
Kështu që unë ndryshuar emrin Abraham Lincoln-së Abrahamit.
Dhe tani ne jemi duke kërkuar për atë që është kthyer nga ky funksionin e kërkimit,
dhe vetëm ajo kthehet proshutë në këtë rast.
Dhe kjo e bën për shkak se kërkoni vetëm natyrisht merr radhën e majtë më.
Dhe të gjitha shprehje të rregullta nëse ju specifikoni ndryshe do të bëjë këtë.
Nëse ne të kërkuar për të gjetur të gjitha ka një funksion për atë - të gjeni të gjitha.
Kështu që vetëm mund të duken si të gjithë re.findall = ('h.m', tekst)
dhe pastaj all.group ().
Të gjitha prodhon si proshutë dhe proshutë, në këtë rast të dy vargjet në çdo Abrahamit proshutë.
Kështu që është një tjetër alternativë.
>> Great. Gjë tjetër për të mbajtur në mend është se shprehje të rregullta të marrë më të madhe intuitive.
Le të shikojmë në këtë shembull.
Ne e bëmë këtë kërkim majtë më këtu, dhe atëherë unë u përpoq një kërkim të madh
duke përdorur operatorin Kleene yll.
Pra për të, "Abraham Lincoln bën sanduiçe proshutë," dhe unë vetëm kam kthyer
M si pasojë.
Arsyeja për këtë ishte gabim që unë mund të ketë marrë ndonjë numër të
h për shkak se unë nuk specifikon asgjë për të shkuar në mes h dhe m.
Shembulli i vetëm që ka pasur m - vetëm shembuj atje me m në të
dhe çdo numri i të h ishin vetëm m string.
Pastaj unë u përpoq përsëri, thashë, "Mirë, le të marrë grupin aktual më të madh këtu".
Dhe atëherë unë e bëri h. * M, kështu që vetëm të kthehet ndonjë numër të karaktereve mes h dhe m.
Dhe në qoftë se ju jeni vetëm duke filluar nga dhe duke menduar, "Oh, në rregull, edhe kjo do të
merrni mua proshutë, "ai në fakt merr gjithçka nga h në Abraham Lincoln
të gjithë rrugën deri në fund të proshutë.
Ajo është i babëzitur; ajo sheh h - e gjithë kjo teksti tjetër - m,
dhe kjo është ajo që ajo merr in
Kjo është një veçanërisht skandaloze - kjo është një tipar ne gjithashtu mund të
specifikojë për mos të jetë ajo babëzitur duke përdorur funksione të tjera.
Por kjo është diçka që ne duhet të mbani në mend sidomos
kur kërkoni në tekst HTML, e cila është një arsye që
shprehje të rregullta janë të vështira për HTML.
Sepse në qoftë se ju keni një tag HTML hapur dhe atëherë shumë gjëra në mes
dhe pastaj disa të tjera të mbyllura HTML tag shumë më vonë në program,
ju keni ngrënë vetëm deri një shumë të HTML kodit tuaj ndoshta gabimisht.
>> Të gjithë të drejtë - aq më shumë karaktere të veçanta, si shumë gjuhë të tjera,
ne shpëtojnë duke përdorur plagë.
Pra, ne mund të përdorni dot që të specifikojë ndonjë karakter, përveç për një linjë të re.
Ne mund të përdorim w shpëtuar të specifikoni ndonjë karakter alfabetik.
Dhe duke arratisjeje d analogji për çdo numër të plotë - karakter numerik.
Ne mund të specifikoni - ne mund të përdorni kllapa për të specifikojë shprehjet e lidhura.
Pra, kjo do të pranojë a, b, ose c.
Dhe ne gjithashtu mund të specifikojë ose opsionet për secilin A ose B.
Për shembull - në qoftë se ne kemi qenë duke kërkuar për mundësitë e shumta
në kllapa ne mund të përdorim operatorin apo si në -
kështu që le të kthehemi në këtë shembull këtu.
Dhe tani le të marrë - le të kthehemi në këtë shembull këtu, dhe pastaj
marrë AE - kështu që kjo duhet të kthehet - Unë mendoj se kjo është ende Abrahami.
Pra, kjo - në qoftë se ne bëjmë të gjitha - e madhe.
Pra, le të rinovuar tekstin këtu.
"Abrahami ha proshutë, ndërsa hemming e tij -. Ndërsa Hemming" Great.
All. Great. Tani kemi marrë, proshutë proshutë, hem dhe.
Ndërsa Hemming - ndërsa gjallë të tij - ndërsa të gjallë hem atij. Great.
E njëjta gjë.
Tani të gjitha kthen ende vetëm proshutë, proshutë, dhe hem pa picking deri në lëvrij apo atij.
Great - kështu që çfarë nëse ne të kërkuar për të parë në qoftë se - kështu që ne mund të bëjmë
apo atë - ne do të kthehen në atë.
Mirë - kështu - të gjithë të drejtë - në pozicione ju gjithashtu mund të përdorni të caret apo shenjë e dollarit
të specifikojë që ju jeni duke kërkuar për diçka në fillim apo në fund të një vargut.
Ose fillimin ose fund të një fjale.
Kjo është një mënyrë për të përdorur këtë.
>> Mirë - kështu që le të luajnë rreth me një bllok pak më të madh të tekstit.
Le të na thonë këtë rresht këtu - këtë deklaratë këtu.
Fuqia e të shprehurit të rregullt është se ata mund të specifikoni modele
nuk fikse vetëm karaktere.
Le ta bëjmë - le të quajmë këtë bllok.
Pastaj ne do të lexoni të gjithë se in
Dhe pastaj të ketë një - le të na bëjë të gjitha =; kështu që çfarë janë disa gjëra që ne mund të kërkoni këtu fitim?
Ne mund të shikoni për veshin e shprehjes.
Jo shumë interesante. Si në lidhje me këtë? Ne do të shohim se çfarë ndodh.
I dha asaj një problem.
Pra, çdo numër i gjërave para se të ri dhe të gjithë.
Kështu që duhet të kthehet gjithçka nga fillimi deri në të gjitha re ndoshta një herë çift.
Dhe atëherë këtu kemi fuqia e shprehje të rregullta është se ata
mund të specifikoni modele jo vetëm karaktere janë këtu.
Pra, të gjithë rrugën deri në finale ri, ajo filloi me më të majtë dhe ishte lakmitar.
Le të shohim - çfarë tjetër mund të shikoni për.
I guess një gjë në qoftë se ju keni qenë të interesuar në kërkim për përemrave ajo dhe ai,
ju mund të kontrolloni për s është e barabartë me 0 ose 1
dhe shprehje ai, dhe që është ndoshta nuk do të kthehet -
oh, unë mendoj se ai u kthye, sepse atje ne jemi duke kërkuar në pushtet, atë ditë, këtu janë.
Le të përpiqemi specifikuar se kjo ka për të ardhur në fillim të diçkaje.
Le të shohim nëse që bie jashtë.
Pra, ne mund të bëjmë yndyrë, dhe atje ne nuk do të marrë asgjë, sepse ajo dhe ai
nuk ndodhin në këtë frazë.
Great. Mirë - kështu përsëri në mace këtu.
Pra, modelet komplekse po dëmton trurin.
Pra, kjo është arsyeja pse ne përdorim shprehje të rregullta për të shmangur këto çështje.
>> Pra, këtu janë disa mënyra të tjera të dobishme që ju mund të luajnë rreth me të.
Ne shikuar në kërkim sot, por ju mund të përdorë gjithashtu, ndarje ndeshje, findall, dhe grupeve.
Gjëra të tjera të ftohtë kështu që ju mund të bëni me shprehje të rregullta përveç vetëm
kërkuar për modele është duke marrë një model dhe mbajtjen gjitha ndeshjet -
Variablat e saj - dhe pastaj duke përdorur ato në kodin tuaj më vonë.
Kjo mund të jetë mjaft e dobishme. Gjëra të tjera mund të jenë të numëruar.
Pra, ne mund të llogarisë numrin e rasteve të një model shprehje të rregullta,
dhe kjo është ajo që ne mund të përdorim për grupe.
Dhe mënyra të tjera, si dhe janë gjithashtu të mundshme.
Kështu që unë vetëm dua të flas pak më shumë në lidhje me mënyra të tjera që ju mund të përdorni shprehje të rregullta.
>> Pra, një aplikim më të avancuar është në matching fuzzy.
Pra, nëse ju jeni duke kërkuar për një tekst për shprehjen, Julius Caesar,
dhe ju shihni ose Gaius Julius Cezarit apo emri i Julius Caesar në gjuhë të tjera,
atëherë ju mund të dëshironi të caktojë një peshë të këtyre vlerave.
Dhe në qoftë se ajo është afër të mjaftueshme - në qoftë se ajo kalon një kufi të caktuar - atëherë ju doni
të jetë në gjendje të pranojë Julius Caesar.
Pra, nuk janë një çift implementime të ndryshme për të cilat në disa gjuhëve të tjera si.
Këtu janë disa mjete të tjera, Regex Pal - një app pak i dobishëm online për të
kontrolloni nëse shprehjet tuaja të rregullta janë të përbërë saktë.
Ka edhe mjete të pavarur që ju mund të drejtuar nga tuaj desktop
si Pico ultra, dhe, si dhe librat e gatimit vetëm.
Pra, nëse ju jeni duke bërë një projekt që përfshin një ton të shprehje të rregullta
kjo është ndoshta vendi për të shkuar jashtë sferës së sotme.
Dhe pastaj vetëm për të ju jap një kuptim të asaj se si është e zakonshme
ekziston grep në Unix, Perl ka ndërtuar-në, dhe C nuk është PCRE për C.
Dhe pastaj të gjitha këto gjuhë të tjera gjithashtu kanë paketa të rregullta shprehje
që veprojnë me thelb të njëjtën sintaksë Ne morëm një shije e sotme.
PHP, Java, Ruby, dhe kështu me radhë.
>> Google Kërko Code është në të vërtetë vlen të përmendet, ajo është një nga
aplikacione relativisht pak atje që lejon publikun të hyrë
Baza e të dhënave të saj duke përdorur shprehje të rregullta.
Pra, nëse ju shikoni në Google Search Kodit ju mund të gjeni kodin
në qoftë se ju jeni duke kërkuar për një shembull se si një funksion mund të përdoret,
ju mund të përdorni një shprehje e rregullt për të gjetur atë funksion duke u përdorur në të gjitha llojet e raste të ndryshme.
Ju mund të shikoni për fwrite, dhe pastaj ju mund të shikoni për flamurin e shkruani ose lexuar
në qoftë se ju të kërkuar një shembull të fwrite duke u përdorur në atë rast.
Pra, e njëjta gjë atje, dhe këtu janë disa referenca.
Kjo do të jetë në dispozicion online, si edhe, kështu që duke shkuar përpara, nëse
ju doni të shikoni në grep, Python, Perl - ju thjesht dëshironi të merrni disa frymëzim
ose në qoftë se ju doni të shikoni më shumë në teori këtu janë disa të mira duke kërcyer off vende.
Shumë falemnderit.
[CS50.TV]