[Powered by Google Translate] [Seminaar: patroon wat ooreenstem met Gereelde Expressions] [John Mussmann-Harvard Universiteit] [Hierdie is CS50.-CS50.TV] Okay. Wel, welkom almal. Dit is CS50 2012. My naam is John, en ek sal praat vandag oor die gereelde uitdrukkings. Gereelde uitdrukkings is hoofsaaklik 'n instrument nie, maar ook soms gebruik in die kode aktief in wese ooreenstem met patrone en snare. So hier is 'n web comic van Kletskerk. In hierdie strokiesprent is daar 'n moord raaisel waar die moordenaar het gevolg iemand op vakansie, en die spelers het om te soek deur 200 MB e-pos op soek na 'n adres. En hulle is oor om op te gee wanneer iemand wat gereelde uitdrukkings weet - vermoedelik 'n superheld - swiep neer en skryf 'n paar kode en los die moord raaisel. So vermoedelik wat iets wat jy sal bemagtig word om te doen na hierdie seminaar. Ons gaan net 'n kort inleiding te gee aan die taal en gee jou genoeg middele om te gaan na meer hulpbronne op jou eie. So gereelde uitdrukkings lyk basies soos hierdie. Dit is 'n gewone uitdrukking in Ruby. Dit is nie vreeslik anders oor tale. Ons het net op die houe te begin, en merk die gewone uitdrukking in Ruby. En dit is 'n gewone uitdrukking om te kyk in e-pos adres patroon. So sien ons by die eerste bietjie kyk vir enige alfanumeriese karakter. Dit is omdat e-pos adresse het dikwels te begin met 'n alfabetiese karakter. En dan 'n spesiale karakter gevolg deur die @-simbool. En dan is dieselfde ding vir die domein naam. En dan tussen 2 en 4 karakters te kyk vir die. Com, net,. En so aan. So dit is nog 'n voorbeeld van 'n gereelde uitdrukking. So gereelde uitdrukkings protokolle vir die vind van editors in die teks. Hulle doen vergelykings, keuses, en vervanging. So 'n derde voorbeeld is die vind van al die telefoonnommers wat eindig in 54 in 'n gids. So voor Dawid vreet die CS50 Gids ons kon soek 'n patroon waar ons hakies dan 3 nommers dan eindig hakies, 3 meer getalle, 'n bietjie, 2 nommers, en dan 54. En dit sou in wese is hoe ons kom met 'n gewone uitdrukking om te soek na dit. So is daar - ons gedoen het 'n paar dinge in CS50 wat 'n bietjie soos gereelde uitdrukkings, so - byvoorbeeld - in die dictionary.C lêer vir die spel check probleem stel jy mag gebruik het fscanf om te lees in 'n woord uit die woordeboek. En jy kan sien die persentasie 45s is op soek na 'n string van 45 karakters. So dit is 'n bietjie soos 'n basiese gewone uitdrukking. En jy kan enige 45 karakters wat pas by die wetsontwerp in daar en kies diegene up. En dan is die tweede voorbeeld in die mees onlangse web probleem op te los stel in die distro-kode vir PHP Ons doen werklik 'n eenvoudige gewone uitdrukking. En hierdie een is eenvoudig net te kyk om te kyk of die webblad wat geslaag het in ooreenstem met óf login of meld registreer. PHP. En dan weer terug waar of onwaar is gebaseer op die gewone uitdrukking wat ooreenstem. So wanneer jy gebruik gewone uitdrukking? Hoekom is jy hier vandag? So jy wil nie gereelde uitdrukking te gebruik wanneer daar is iets wat doen die werk vir jou nog makliker. So XML en HTML is eintlik redelik moeilike gereelde uitdrukkings te skryf soos ons sal sien in 'n bietjie. So is daar toegewyde ontleders vir hierdie tale. Jy moet ook goed wees met die handel offs en akkuraatheid gereeld. As jy probeer - so ons het 'n gereelde uitdrukking vir 'n e-pos adres, maar sê jy wou 'n spesifieke e-pos adres en geleidelik die gereelde uitdrukking dalk meer kompleks as dit is meer akkuraat. So wat sou een handel af wees. Jy het om seker te wees dat jy okay is om met die gewone uitdrukking. As jy weet presies wat jy is op soek na dit dalk meer sin maak te sit in die tyd en skryf vir 'n meer doeltreffende ontleder. En uiteindelik is daar 'n historiese probleem met die gereeldheid van uitdrukking en tale. Gereelde uitdrukkings is eintlik baie meer kragtig as gereelde uitdrukkings per sê in 'n formele sin. So ek wil nie te ver gaan in die formele teorie, maar die meeste tale wat ons kode in werklikheid is nie gereeld. En dit is die rede waarom gereelde uitdrukkings soms nie in ag geneem almal wat veilig is. So basies is daar 'n Chomsky-hiërargie vir tale, en gereelde uitdrukkings te bou met behulp van Unie, aaneenskakellling, en die Kleene ster operasie wat ons sal sien in 'n paar minute. As jy belangstel in teorie daar is nogal 'n baie gaan op daar onder die kap. So 'n kort geskiedenis - net vir die konteks hier - gereelde stelle vorendag gekom in die 1950's, en dan het ons 'n eenvoudige redakteurs wat opgeneem gereelde uitdrukkings - net soek vir strykers. Grep - wat is 'n command line instrument - was een van die eerste baie gewild gereedskap wat opgeneem gereelde uitdrukkings in die 1960's. In die 80's, was Perl gebou - is 'n programmeertaal wat sluit gereelde uitdrukkings baie prominent. En meer onlangs het ons Perl versoenbaar gewone uitdrukking protokolle basies in ander tale wat gebruik maak van baie van dieselfde sintaks. Natuurlik die belangrikste gebeurtenis was in 2008 waar daar was die eerste Nasionale Gereelde Expressions Day, wat ek glo is 1 Junie as jy wil dit te vier. Weereens, net 'n bietjie meer teorie hier. So is daar 'n paar verskillende maniere van die bou van gereelde uitdrukkings. 'N eenvoudige manier is om die uitdrukking te bou wat jy gaan loop op die tou te interpreteer - basies bou van 'n klein mini-program wat analiseer stukke van 'n string en sien, "O, pas dit die gewone uitdrukking of nie?" En dan loop nie. So as jy 'n baie klein gereelde uitdrukking, is dit waarskynlik die mees doeltreffende manier om dit te doen. En dan as jy - 'n ander opsie is om te hou rekonstruksie van die uitdrukking as jy gaan, en wat is die moontlikheid simuleer. En hierdie vroeë pogings om op 'n gereelde uitdrukking algoritmes was relatief eenvoudige en relatief vinnig, maar het nie 'n baie buigsaamheid. So om selfs 'n paar van die dinge wat ons gaan om te kyk na Vandag het ons meer komplekse gereelde uitdrukking te doen implementering wat potensieel veel stadiger, so dit is iets om in gedagte te Daar is ook 'n gereelde uitdrukkings ontkenning van die aanval verskeidenheid wat gebruik maak van die potensiaal vir hierdie nuwe implementering van gereelde uitdrukkings om 'n baie kompleks. En in baie dieselfde sin dat ons gesien het in buffer oorloop aanvalle, jy het aanvalle wat werk deur die maak van rekursiewe sirkelroetes oorrompel die kapasiteit van die geheue. En op die pad Regexen is een van die amptelike meervoude van gewone uitdrukking deur analogie beeste in die Anglo-Saksiese. Goed, so die Python biblioteek baie van julle hier in persoon Macs, sodat jy kan eintlik trek dit op jou skerm. Gereelde uitdrukkings is gebou in Python. En so Python is preloaded op Mac en ook aanlyn beskikbaar by hierdie skakel. So as jy kyk wat jy kan breek en maak seker jy het Python as ons speel hier rond. Daar is 'n handleiding online, so as jy net Python tik in jou rekenaar sal jy sien dat die weergawe kom in die terminale. So ek het 'n skakel na die handleiding vir weergawe 2 van Python sowel as 'n oneerlik vel. Daar is 'n weergawe 3 van Python, maar jou Mac nie noodwendig kom met wat preloaded. So nie vreeslik anders. Goed, so 'n paar basiese beginsels van die gebruik van gereelde uitdrukkings in Python. So hier is wat ek gebruik 'n baie eenvoudige uitdrukking, so ek het Python invoer re en dan het die gevolg van re.search. En die soektog neem 2 argumente. Die eerste is die gewone uitdrukking, en die tweede is die teks of string wat jy wil om te ontleed. En dan het ek gedruk uit die result.group. So dit is die 2 basiese funksies wat ons gaan om te sien vandag in die leer oor gereelde uitdrukkings. So net die afbreek van die gewone uitdrukking hier h en dan \ w en dan m so \ w aanvaar sommer enige alfabetiese karakter in daar. So hier is ons op soek is na 'n "h" en dan nog 'n letter van die alfabet en dan m, so hier is wat sal ooreenstem ham in, "Abraham Lincoln en ham toebroodjies." Dit is die resultaat van die groep. Nog 'n ding wat ons kan doen is om ons voor die snare van die teks in Python. So ek dink ek gaan voort en trek dat tot hier. Python invoer re. En as ek dieselfde ding te doen - laat ons sê teks is, "Abraham," laat ons zoom in - daar gaan ons. Die teks is, "Abraham eet ham." Goed, en dan lei = re.search. En dan is ons uitdrukking kan h, en dan sal ek dit doen dot m. So dot neem net 'n karakter wat nie 'n nuwe lyn insluitend nommers, persentasie tekens, iets soos dit. En dan teks - boom - en dan result.group--ja. So dit is net hoe basiese funksies om hier te implementeer. As ons 'n teks ring wat - wat mal teks - ingesluit sê baie van die terug houe en snare binne en dinge wat lyk soos 'escape sequences, dan sal ons waarskynlik wil die rou teks invoer te gebruik om seker te maak dat aanvaar word. En dit lyk net soos dit. So as ons is op soek na elkeen van hulle in daar moet ons dit nie vind nie. Maar dit is hoe jy dit sou implementeer; net voor die string die gewone uitdrukking jy het die brief r. Goed, so laat ons gaan. Alle reg - so kom ons kyk na 'n paar herhalende patrone hier. So een ding wat jy wil doen, is herhaal dinge as jy op soek is deur teks. Om dit te doen 'n gevolg deur 'n aantal van b - jy doen AB *. En dan is daar 'n reeks van ander reëls ook. En jy kan sien al hierdie up, ek sal net loop deur 'n paar van die mees algemeen gebruik word kinders. So AB + is 'n gevolg deur 'n N groter as 0 of b. AB? is 'n gevolg deur 0 of 1 van b. AB {N} is 'n gevolg deur N van b, en dan so aan. As jy 2 nommers in die krulhakies jy spesifiseer van 'n reeks wat kan moontlik ooreenstem. So sal ons kyk meer na 'n paar herhalende patrone in 'n minuut. So 2 dinge in gedagte te hou wanneer die gebruik van hierdie patroon wat ooreenstem met gereedskap hier. So sê ons wil om te kyk na die hm van, "Abraham Lincoln maak ham toebroodjies." So ek verander Abraham Lincoln se naam na Abraham. En nou is ons op soek na wat is teruggestuur deur hierdie soektog funksie, en dit gee net ham in hierdie geval. En is dit nie dat, omdat soek natuurlik net neem die linker mees tou. En al die gereelde uitdrukkings, tensy jy anders spesifiseer, sal dit doen. As ons wou almal om te vind daar is 'n funksie vir daardie - vind nie. So wat net lyk soos almal = re.findall ('h.m', text) en dan all.group (). Alle produseer beide Gam en ham, in hierdie geval beide van die snare in Abraham elke ham. So dit is 'n ander opsie. Groot. Die ander ding wat in gedagte moet hou, is dat gereelde uitdrukkings Neem die grootste intuïtief. Kom ons kyk na hierdie voorbeeld. Ons het dit het die meeste search hier, en dan het ek probeer om 'n groter soek gebruik van die Kleene ster operateur. So nie, "Abraham Lincoln maak hamtoebroodjies," en ek het net terug m as 'n resultaat. Die rede vir die fout was dat ek kon geneem het 'n aantal h is, want ek het nie iets om te gaan in tussen h en m spesifiseer. Die enigste voorbeeld is daar wat 'm - die enigste voorbeelde is daar met m in dit en 'n aantal van h se was net die string m. Toe het ek probeer om dit weer, ek het gesê: "Goed, laat ons die werklike grootste groep hier." En dan het ek gedoen h. * M, sodat net terugkeer enige aantal karakters tussen h en m. En as jy net begin en dink, "O, okay, goed dit sal kry my ham, "Dit neem eintlik alles van die h in Abraham Lincoln al die pad tot aan die einde van Gam. Dit is gulsig, dit sien h - al hierdie ander teks - m, en dit is wat dit neem om in Dit is 'n besonder uitmuntend - dit is 'n funksie kan ons ook spesifiseer vir dit nie gulsig wees met behulp van ander funksies. Maar dit is iets wat ons moet in gedagte hou veral wanneer jy kyk na HTML teks, wat is een van die redes wat gereelde uitdrukkings is moeilik vir HTML. Want as jy 'n HTML tag oop en dan baie van die dinge wat in die middel en dan 'n paar ander HTML gesluit tag veel later in die program, jy het nou net geëet 'n baie van jou HTML-kode dalk per ongeluk. Alle reg - so meer spesiale karakters, soos baie ander tale, ons ontsnap die gebruik van die streep. So kan ons die dot die gebruik van enige karakter te gee nie, behalwe vir 'n nuwe lyn. Ons kan gebruik om die ontsnapping w enige alfabetiese karakter te gee. En deur analogie ontsnap d vir enige heelgetal - numeriese karakter. Ons kan spesifiseer - ons kan gebruik tussen hakies verwante uitdrukkings te spesifiseer. So dit sou aanvaar, b of c. En ons kan ook spesifiseer of opsies vir óf 'n of b. Byvoorbeeld - as ons is op soek na verskeie moontlikhede in hakies kon ons die of operateur gebruik as in - so laat ons gaan terug na die voorbeeld hier. En nou, laat ons neem - laat ons gaan terug na die voorbeeld hier, en dan neem ae - so dit moet terug - ek dink dit nog steeds is Abraham. So hierdie - as ons almal - groot. So laat ons werk om die teks hier. "Abraham eet ham, terwyl omsluit sy -. Terwyl Hemming" Groot. Almal. Groot. Nou kry ons Gam, Gam en Hom. Terwyl Hemming - terwyl neurie aan hom - terwyl neurie te soom hom. Groot. Dieselfde ding. Nou het al terug nog net Gam, Gam en hom sonder optel op die neurie of die hom. Groot - so what as ons wou om te kyk na óf dat - so kan ons ook doen hom of nie - ons sal terug te kom na daardie. Goed - so - al reg - in posisies wat jy kan ook gebruik om die kappie of die dollar-teken om te bepaal wat jy soek vir iets aan die begin of die einde van 'n string. Of die begin of die einde van 'n woord. Dit is een manier om dit te gebruik. Goed - so laat ons speel rond met 'n effens groter blok van teks. Kom ons sê dit ry hier - hierdie stelling hier. Die krag van 'n gereelde uitdrukking is dat hulle patrone kan spesifiseer nie net vas karakters. Kom ons maak - kom ons noem hierdie blok. Dan sal ons lees al wat in En dan het 'n - laat ons almal =, so wat is 'n paar dinge wat ons kan soek in hier winsgewend? Ons kan kyk vir die uitdrukking gehoor. Nie baie interessant. Hoe gaan dit? Ons sal sien wat gebeur. Ek het dit 'n probleem. So 'n aantal van die dinge voordat dit weer en almal. Sodat moet terugkeer alles van die begin tot al weer miskien 'n paar keer. En dan is hier ons het die krag van die gereelde uitdrukkings is dat hulle kan spesifiseer patrone nie net karakters hier is. So al die pad tot by die finale re, dit begin met die linker en die meeste was gulsig. Kom ons kyk - wat anders kan ons kyk vir. Ek dink een ding as jy belangstel in op soek na die voornaamwoorde sy en hy jy kan kyk vir s gelyk aan 0 of 1 en die uitdrukking hy, en dit is waarskynlik nie van plan om terug te keer - O ja, ek dink dit teruggekeer het, want daar is ons op soek na die krag, daardie dag, hier is. Kom ons probeer verduidelik dat dit het om te kom aan die begin van iets. Kom ons kyk of dit val af. So ons kan doen om vet, en daar kry ons niks doen nie, want sy en hy kom nie in hierdie frase. Groot. Goed - so terug na die kat hier. So komplekse patrone is seer van die brein. So dit is hoekom ons gebruik reëlmatige uitdrukkings hierdie kwessies te vermy. So hier is 'n paar ander nuttige maniere wat jy kan speel rond met. Ons kyk na soek vandag, maar jy kan ook gebruik match, verdeel, findall, en groepe. So ander cool dinge wat jy kan doen met gereelde uitdrukkings behalwe net soek vir patrone is die neem van 'n patroon en hou al die wedstryde - die veranderlikes - en dan met behulp van die mense in jou kode later op. Dit kan baie nuttig. Ander dinge kan tel nie. So kan ons die telling van die aantal gevalle van 'n gewone uitdrukking patroon, en dit is wat groepe wat ons kan gebruik vir. En ander maniere as goed is ook moontlik. So ek wil net 'n bietjie meer praat oor die ander maniere wat jy kan gebruik om gereelde uitdrukkings. So 'n meer gevorderde toepassing is in matches. So as jy op soek is na 'n teks vir die uitdrukking, Julius Caesar, en jy sien of Gaius Julius Caesar of die naam Julius Caesar in ander tale, dan kan jy dalk wil ook bietjie gewig toe te ken aan daardie waardes. En as dit naby genoeg is - as dit oor 'n sekere drumpel - dan is jy wil staat te wees om Julius Caesar te aanvaar. So is daar 'n paar verskillende toepassings daarvoor in 'n paar ander tale. Hier is 'n paar ander instrumente, Regex Pal - 'n handige klein artikels aanlyn te kyk of jou gereelde uitdrukkings korrek saamgestel is. Daar is ook selfstandige gereedskap wat jy kan hardloop vanaf jou lessenaar soos Ultra Pico, en so goed as net kookboeke. So as jy besig met 'n projek wat behels 'n ton van die gereelde uitdrukkings dit is waarskynlik die plek om te gaan buite die bestek van vandag. En dan net om te gee jou 'n gevoel van hoe algemeen dit is daar is grep in Unix, Perl het 'n ingeboude in, en C is daar PCRE vir C. En dan sal al die ander tale ook gereelde uitdrukking pakkette wat werk met basies dieselfde sintaks ons het 'n voorsmakie van vandag. PHP, Java, Ruby, en so aan. Google Code Search is eintlik noemenswaardig nie, dit is een van die relatief min programme daar buite wat kan die publiek om toegang te verkry sy databasis met behulp van gereelde uitdrukkings. So as jy kyk op Google Code Search kan jy kode As jy op soek is na 'n voorbeeld van hoe 'n funksie kan gebruik word, jy kan 'n gewone uitdrukking gebruik dat die funksie wat gebruik word in alle vorme van verskillende gevalle te vind. Jy kan kyk vir fwrite, en dan kan jy kyk vir die vlag van lees of skryf As jy wil 'n voorbeeld van fwrite wat gebruik word in daardie geval. So dieselfde ding daar, en hier is 'n paar verwysings. Dit sal ook aanlyn beskikbaar wees, so gaan vorentoe as jy wil om te kyk na Python, grep, Perl - jy wil net 'n inspirasie te kry of as jy meer wil om te kyk na die teorie hier is 'n paar goed af te spring plekke. Baie dankie. [CS50.TV]