[Powered by Google Translate] [Málstofa: Pattern Matching með Venjulegur Tjáning] [John University Mussman-Harvard] [Þetta er CS50.-CS50.TV] Allt í lagi. Jæja, velkomin allir. Þetta er CS50 2012. Mitt nafn er John, og ég mun vera að tala í dag um reglulegar segðir. Venjulegur tjáning er fyrst og fremst tæki, en einnig stundum notað í númerið virkan að raun passa mynstur og strengi. Svo hér er vefur grínisti frá xkcd. Í þessu grínisti er morð ráðgáta þar sem morðingi hefur fylgt einhver á fríi, og söguhetjur hafa til leitað 200 megabæti af tölvupósti leita að heimilisfangi. Og þeir eru að fara að gefa upp þegar einhver sem veit venjulegur tjáning - væntanlega ofurhetja - swoops niður og skrifar nokkur númer og leysa morð ráðgáta. Svo væntanlega að vilja vera eitthvað sem þú verður að hafa vald til að gera eftir þessa ráðstefnu. Við erum bara að fara að gefa nákvæmt kynningu á tungumáli og gefa þér nóg bolmagn til að fara eftir fleiri úrræði á eigin spýtur. Svo venjulegur tjáning líta í grundvallaratriðum eins og þetta. Þetta er venjulegur tjáning í Ruby. Það er ekki hræðilega öðruvísi á milli tungumála. Við höfum bara um rista að byrja og merkja reglulega segð í Ruby. Og þetta er reglulega segð til að leita í netfang mynstur. Svo við sjáum í fyrsta bita útlit fyrir tölu staf. Það er vegna þess að netföng oft að byrja með bókstaf. Og þá hvaða sértákn á eftir @ tákni. Og þá það sama fyrir ríki nafn. Og þá á milli 2 og 4 stafir að leita að. Com,. Net, og svo framvegis. Svo er að annað dæmi um reglulega segð. Svo venjulegur tjáning eru samskiptareglur til að finna patters í texta. Þeir gera samanburð, vali, og skipti. Svo þriðja dæmi er að finna öllum símanúmerunum sem endar á 54 í möppu. Svo áður en David rifnar upp CS50 skrá við gætum leitað að mynstur þar sem við höfum sviga þá 3 tölur enda þá sviga, 3 fleiri tölur, bandstrik, 2 tölur, og þá 54.. Og það væri í raun hvernig við komum upp með reglulegu segð til að leita að því. Þannig að það eru - við höfum gert nokkra hluti í CS50 sem eru svolítið eins og venjulegur tjáning, svo - til dæmis - í dictionary.C skrá fyrir villuleit Heimadæmi þú gætir hafa notað fscanf að lesa í orði úr orðabókinni. Og þú getur séð hlutfall 45s er að leita að band 45 stafi. Svo er það nokkuð eins og rudimentary reglulegri segð. Og þú getur haft hvaða 45 persónur sem passa frumvarpið þar og velja þá upp. Og þá annað dæmi í nýjustu vefur forritun vandamál setja í distro kóða fyrir PHP við gerum raunverulega hafa a einfaldur reglulega segð. Og þetta er bara einfaldlega að leita til að athuga hvort vefsíðan sem er samþykkt í passar annaðhvort innskráningu eða Útskrá skrá. PHP. Og síðan aftur rétt eða rangt byggist á því reglulega segð samsvörun. Svo þegar þú notar reglulega segð? Hvers vegna ert þú hér í dag? Svo þú vilt ekki að nota reglulega segð þegar það er eitthvað sem hjartarskinn the starf fyrir þig jafnvel fleiri auðveldlega. Svo XML og HTML eru reyndar mjög erfiður að skrifa reglulegar segðir eins og við munum sjá í smá. Þannig að það eru hollur parsers fyrir þessum tungumálum. Þú þarft einnig að vera í lagi með viðskipti offs og nákvæmni oft. Ef þú ert að reyna - svo við sáum reglulega segð um netfang, en segjum að þú vildir ákveðna netfang og smám saman Regluleg segð gæti orðið flóknara og það varð nákvæmari. Svo það væri ein viðskipti burt. Þú þarft að vera viss um að þú ert allt í lagi að gera við reglulega segð. Ef þú veist nákvæmlega hvað þú ert að leita að það gæti gert meira vit að setja í tíma og skrifa skilvirkari flokka. Og að lokum er það söguleg mál með nemi tjáning og tungumál. Reglulegar segðir eru í raun miklu öflugri en venjulegur tjáning á að segja í formlegri skilningi. Svo ég vil ekki að fara of langt inn í formlegu kenningunni en flestir tungumál sem við kóða í raun eru ekki reglulega. Og þetta er ástæðan venjulegur tjáning stundum eru ekki talin allt sem örugg. Svo í rauninni er Chomsky stigveldi fyrir tungumálum, og venjulegur tjáning eru að byggja upp með stéttarfélags, samtenging, og á Kleene stjörnu aðgerð sem við munum sjá í nokkrar mínútur. Ef þú hefur áhuga í orði það er alveg mikið að fara á það undir hetta. Svo stutta sögu - bara fyrir samhengi hér - regluleg setur kom upp í 1950, og þá höfðum við einföld ritstjórar sem felld venjulegur tjáning - bara leita fyrir strengi. Grep - sem er a stjórn lína tól - var einn af fyrstu mjög vinsæl tól sem tekin venjulegur tjáning í 1960. Í '80s, var Perl built - er forritunarmál sem fella reglulegar segðir mjög áberandi. Og svo nýlega höfum við fengið Perl samhæft reglulega segð samskiptareglur í grundvallaratriðum á öðrum tungumálum sem nota mikið af sömu setningafræði. Auðvitað mikilvægasti atburður var árið 2008 þar var fyrsta National Venjulegur Tjáning Day, sem ég tel er 1 júní ef þú vilt að fagna því. Aftur, bara svolítið meira kenning hér. Þannig að það eru nokkrar mismunandi leiðir til að byggja reglulegar segðir. Ein einföld leið er að byggja upp tjáningu sem þú ert að fara að hlaupa á band túlka - í grundvallaratriðum að byggja lítið Mini-forrit sem að greina stykki af streng og sjá, "Ó, er þetta passa reglulega segð eða ekki?" Og þá hlaupa það. Svo ef þú ert með mjög lítið reglulega segð, þetta er líklega skilvirkasta leiðin til að gera það. Og þá ef þér - annar valkostur er að halda endurgera tjáningu eins og þú fara, og það er líkja möguleiki. Og þessar fyrstu tilraunir með reglulegu reiknirit tjáningu voru tiltölulega einföld og tiltölulega hratt, en ekki hafa a einhver fjöldi af sveigjanleika. Svo til að gera jafnvel sumir af þeim hlutum sem við erum að fara að horfa á í dag höfum við þurft að gera flóknari reglulega segð gerð sem eru hugsanlega miklu hægar, svo það er eitthvað til að hafa í huga There 'einnig a venjulegur tjáning afneitun ýmsum árás að nýta sér möguleika fyrir þessar nýrri gerð af venjulegur tjáning til að verða mjög flókið. Og á mjög svipaðan hátt að við sáum í biðminni flæða árásum, þú þarft árásir sem vinna með því að gera endurkvæma lykkjur að Farið yfir getu minni. Og við á leiðinni Regexen er eitt af opinberum fleirtölu reglulega segð á hliðstæðan hátt naut í engilsaxneskum. Jæja, svo Python Library mörg ykkar hér í persónu hafa Macs, svo þú getur raunverulega rífa þetta upp á þinn skjár. Reglulegar segðir eru byggð inn í Python. Og svo Python er preloaded á Macs og einnig á netinu á þennan tengil. Svo ef þú ert að horfa á þú getur hvílt og tryggja þú hafa Python eins og við leika í kring hér. Það er handbók á netinu, þannig að ef þú slærð bara Python í tölvuna þína þú munt sjá að útgáfa kemur upp í flugstöðinni. Svo ég enda tengil á handbók fyrir útgáfu 2 af Python auk Cheat Sheet. Það er útgáfa 3 af Python, en Mac þinn styður ekki endilega koma með það preloaded. Svo ekki hræðilega öðruvísi. Jæja, svo sumir grunnatriði nota reglulegar segðir í Python. Svo hér er ég nota mjög einfalt tjáningu, svo ég gerði Python innflutningur tilvísun og þá tók niðurstöðu re.search. Og leit tekur 2 rök. Í fyrsta lagi er venjulegur tjáning, og annað er textinn eða band þú vilt að greina. Og svo ég prenta út result.group. Svo að þetta eru 2 helstu aðgerðir sem við ætlum að sjá í dag í að læra um reglulegar segðir. Svo bara að brjóta niður þetta reglulega segð hér klst og þá \ w og síðan m svo \ w tekur bara hvaða bókstaf í there. Svo hér erum við að leita að "H" og þá annar bókstaf og þá m, svo hér sem myndi passa skinku í, "Abraham Lincoln og skinku samlokur." Þetta er afleiðing af þeim hópi. Annar hlutur sem við getum gert er að nota áður en strengi okkar texta í Python. Svo ég held ég mun fara á undan og draga það upp hér. Python innflutningur aftur. Og ef ég væri að gera það sama - við skulum segja textinn er, "Abraham," skulum súmma inn - svona. Texti er, "Abraham étur skinku." Jæja, og þá leiða = re.search. Og þá tjáningu okkar getur verið h, og þá get ég gert punktur m. Svo tekur punktur bara hvaða staf sem er ekki ný lína þar á meðal tölur, hlutfall merki, eitthvað svoleiðis. Og þá texta - Boom - og þá result.group--já. Svo er það bara hvernig á að framkvæma undirstöðu-virkni hér. Ef við hefðum texta hringur sem - að brjálaður texta - Innifalið segja fullt af bak rista og strengir inni og það sem gæti litið svona röð flýja, þá viljum við sennilega að nota hrátt ritun til að tryggja að er samþykkt. Og það bara lítur út eins og þessi. Þannig að ef við vorum að leita fyrir hvert þeirra þar við ættum ekki að finna neitt. En það er hvernig þú myndir framkvæma það, rétt áður en strengur reglulega segð þú setur stafinn r. Jæja, svo við skulum halda áfram. Allt í lagi - svo við skulum líta á nokkrar endurteknar mynstur hér. Svo er einn hlutur sem þú vilt gera endurtaka hlutina eins og þú ert að leita í gegnum texta. Svo að gera með einhverjum af b - þú ab *. Og svo eru nokkrar aðrar reglur líka. Og þú getur að líta öll þessi upp, ég bara hlaupa í gegnum sumir af the algengastar sjálfur. Svo er AB + A eftir einhverjum N meiri en 0 af b. AB? er fylgt eftir með 0 eða 1 af b. AB {N} er fylgt eftir með N frá b, og þá svo framvegis. Ef þú átt 2 tölur í hrokkið axlabönd þú ert að tilgreina svið sem getur hugsanlega passa. Þannig að við munum líta betur á núna endurteknar mynstur í eina mínútu. Svo 2 hlutir til að hafa í huga þegar þú notar þessi mynstur samsvörun tæki hér. Svo segja að við viljum að líta á HM á, "Abraham Lincoln gerir skinku samlokur." Svo ég breytti nafni Abraham Lincoln til Abrahams. Og nú erum við að leita að því sem er skilað með þessari leit virka, og það skilar aðeins skinku í þessu tilfelli. Og það þýðir að vegna leita bara tekur náttúrulega vinstri mest biðröð. Og allir venjulegur tjáning nema þú tilgreinir annað mun gera það. Ef við vildum að finna allt sem er fall fyrir það - að finna allt. Svo sem gæti bara líta út eins og allar = re.findall ('h.m', texti) og þá all.group (). Allt framleiðir bæði skinku og skinku, í þessu tilfelli bæði strengi í Abraham hverju skinku. Svo er það annar valkostur. Great. The annar hlutur til viðurværi í hugur er að venjulegur tjáning Taktu stærsta innsæi. Leyfðu okkur að líta á þetta dæmi. Við gerðum það skilið mest leita hér, og þá ég reyndi stærri leit nota Kleene stjörnu rekstraraðila. Svo fyrir, "Abraham Lincoln gerir skinku samlokur," og ég fékk bara til baka m í kjölfarið. Ástæðan fyrir þessi mistök var að ég hefði getað tekið hvaða fjölda H er vegna þess að ég gerði ekki tilgreina neitt til að fara á milli h og m. Eina dæmið þar sem hafði m - eina dæmi þar með m í það og allir tala um á H voru bara band m. Og ég reyndi það aftur, ég sagði: "Jæja, við skulum fá raunverulegt stærsta hópinn hér." Og svo ég gerði h. * M, þannig að bara skilar allir tala um stafir milli h og m. Og ef þú ert réttlátur byrjun út og hugsa, "Ó, allt í lagi, vel þetta mun fá mér skinku, "það tekur í raun allt frá h í Abraham Lincoln alla leið upp til loka skinku. Það er gráðugur, það sér h - allt þetta annar texti - m, og það er það sem það tekur inn Þetta er sérstaklega egregious - þetta er eiginleiki sem við getum einnig tilgreina fyrir það ekki vera gráðugur að nota aðra valkosti. En þetta er eitthvað sem við verðum að hafa í huga sérstaklega þegar þú horfir á HTML texta, sem er ein ástæða þess að venjulegur tjáning er erfitt fyrir HTML. Vegna þess að ef þú ert með HTML opinn tag og síðan fullt af dóti í miðjunni og þá nokkrar aðrar HTML lokað tag mun síðar í áætluninni, þú hefur bara borðað upp a einhver fjöldi af HTML kóðann þinn hugsanlega fyrir mistök. Allt í lagi - svo fleiri sértákn, eins og mörg önnur tungumál, við að flýja með því að nota skástrik. Svo við getum notað punktur að tilgreina hvaða staf nema fyrir nýja línu. Við getum notað flýja w að tilgreina hvaða bókstaf. Og á hliðstæðan flýja D fyrir hvaða heiltala - tölulegar staf. Við getum skilgreint - við getum notað sviga tilgreina viðkomandi tjáning. Þannig að þetta myndi taka A, B, eða C. Og við getum einnig tilgreina eða valkosti fyrir annaðhvort a eða b. Til dæmis - ef við vorum að leita að mörgum möguleikum í sviga við gætum notað eða rekstraraðila sem í - svo við skulum fara aftur til þessa dæmis hér. Og nú skulum við taka - við skulum fara aftur til þetta dæmi hér, og þá taka AE - þannig að þetta ætti að fara aftur - ég held að þetta sé enn Abraham. Svo þetta - ef við gerum allt - frábær. Svo skulum uppfæra texta hér. "Abraham étur skinku en humm hans -. Meðan Hemming" Great. Allt. Great. Nú erum við að fá skinku, skinka, og faldi. Þó Hemming - en humming honum - en humming að faldi hann. Great. Sami hlutur. Nú skilar allt enn bara skinka, skinka, og faldi án tína upp á suð eða honum. Great - svo hvað ef við vildum að líta á hvort það - svo við gætum líka gert hann eða - við munum koma aftur til það. Jæja - svo - allt í lagi - í stöðu sem þú getur líka notað Caret eða dollaramerki að tilgreina að þú ert að leita að einhverju í upphafi eða við lok streng. Eða byrja eða enda orð. Það er ein leið til að nota það. Jæja - svo við skulum leika í kring með örlítið stærri blokk af texta. Leyfðu okkur að segja þessari röð hér - þessa yfirlýsingu hér. The máttur af reglulegri segð er að þeir geta tilgreina mynstur ekki bara fastur stafi. Leyfðu okkur að gera - við skulum kalla þessa blokk. Þá munum við lesa öll þessi inn Og þá hafa - við skulum gera allt =; svo það eru nokkur atriði sem við gætum leita hér hagnaði? Við gætum litið á tjáningu eyra. Ekki mjög áhugavert. Hvað um það? Við munum sjá hvað gerist. Ég gaf það vandamál. Svo allir tala af hlutur áður aftur og allt. Svo sem ætti að skila allt frá upphafi upp á allar aftur kannski í nokkur skipti. Og svo hér höfum við vald venjulegur tjáning er að þeir hægt að tilgreina mynstur ekki bara stafir eru hér. Svo alla leið til endanlegs aftur, byrjaði með vinstri mest og var gráðugur. Látum okkur sjá - hvað annað getum við leita að. Ég giska eitt ef þú varst áhuga á að leita að fornöfn hún og hann, þú gætir athuga s er jafnt 0 eða 1 og tjáningu hann, og það er líklega ekki að fara að fara aftur - ó, held ég að það skilaði hann því það sem við erum að horfa á vald, þessi dagur, hér eru. Leyfðu okkur að reyna að skilgreina að þetta hefur að koma í upphafi eitthvað. Látum okkur sjá ef það lækkar burt. Svo við getum gert fitu, og þar sem við fæ ekki neitt vegna þess að hún og hann gera sér stað ekki í þessari setningu. Great. Jæja - svo aftur til the köttur hér. Svo flókin mynstur er að meiða heilann. Svo er að hvers vegna við notum reglulegar segðir til að forðast þessi mál. Svo hér eru nokkrar aðrar gagnlegar stillingar sem þú getur spilað í kring með. Við leit á leit í dag, en þú getur líka notað jafningi, Split, findall og hópa. Svo annar kaldur hlutur sem þú getur gert með reglulegum segðum auki bara leita að mynstri er að taka upp mynstur og halda alla leiki - breytur hennar - og þá með þeim í kóðanum þínum síðar. Það getur verið mjög gagnlegt. Önnur atriði mætti ​​telja. Svo við getum treyst fjölda dæmi af reglulega segð mynstur, og það er það sem við getum notað hópa fyrir. Og aðrar tegundir eins vel eru einnig mögulegt. Svo ég vil bara að tala svolítið meira um aðrar leiðir sem þú getur notað reglulegar segðir. Svo er eitt háþróaður umsókn í loðnu samsvörun. Svo ef þú ert að leita að texta á tjáningu, Julius Caesar, og þú sérð annaðhvort Gaius Julius Caesar eða nafn Júlíus Sesar í öðrum tungumálum, þá þú might einnig vilja til að úthluta sumir þyngd þeim gildum. Og ef það er nógu nálægt - ef það fer ákveðinn þröskuld - þá þú vilt að vera fær um að taka Julius Caesar. Þannig að það eru nokkrar mismunandi útfærslur fyrir að í nokkrum öðrum tungumálum eins og heilbrigður. Hér eru nokkrar aðrar verkfæri, Ríkisstjóratíð Pal - a handlaginn lítill app netinu til athuga hvort venjulegur tjáning eru skipuð rétt. Það eru einnig sjálfstæða tól sem þú getur keyrt á skjáborðinu þínu eins Ultra Pico, og auk réttlátur Matreiðslubækur. Svo ef þú ert að gera verkefni sem felur í sér tonn af reglulegar segðir þetta er líklega staðurinn til að fara utan gildissviðs dag. Og þá bara til að gefa þér tilfinningu um hversu algengt er það er grep í Unix, Perl hefur innbyggður-í, og C er PCRE fyrir C. Og svo öll þessi önnur tungumál hafa einnig reglulega pakka tjáningu sem starfa með aðalatriðum á sama setningafræði Við fengum bragð af í dag. PHP, Java, Ruby, og svo framvegis. Google Code Leit er í raun virði að minnast, það er eitt af tiltölulega fáir forrit þarna úti sem leyfir almenningi aðgang gagnagrunn þess að nota reglulegar segðir. Svo ef þú horfir á Google Code Leita þú getur fundið kóðann ef þú ert að leita að dæmi um hvernig fall gæti verið notað, þú getur notað reglulega segð til að komast að því að virka sem notuð eru í alls konar mismunandi tilvikum. Þú getur litið á fwrite, og þá gætirðu leita fána skrifa eða lesa ef þú vildir dæmi um fwrite verið notað í því tilfelli. Svo það sama þar, og hér eru nokkrar tilvísanir. Þetta verður í boði á netinu eins og heilbrigður, svo fara fram ef þú vilt líta á Python, grep, Perl - þú vilt bara að fá smá innblástur eða ef þú vilt að horfa meira á kenningu hér eru nokkur góð stökk burt stöðum. Þakka þú mjög mikill. [CS50.TV]