[Powered by Google Translate] [Seminar: Iskanje vzorcev regularnih izrazov]
[John Mussman-Harvard University]
[To je CS50.-CS50.TV]
Ok. No, dobrodošli vsi. To je CS50 2012.
Moje ime je John, in bom lahko danes govorimo o regularnih izrazih.
Regularni izrazi predvsem orodje, ampak tudi včasih uporablja
v kodi aktivno v bistvu ujemajo vzorce in godala.
Torej, tukaj je spletni strip iz xkcd.
V tej stripe je umor skrivnost, kjer je morilec
sledijo nekoga na dopustu, in zamišljajo, da
iskanje po 200 megabajtov elektronske pošte iščejo za naslov.
In so na tem, da se, ko nekdo, ki ve, regularne izraze -
predvidoma superheroj - swoops navzdol in piše nekaj kode
in rešuje umor skrivnost.
Torej, verjetno, da bo nekaj, kar vas bo pooblaščena za to
Po tem seminarju.
Mi smo le, da bo zagotoviti kratek in jedrnat uvod v jezik
in vam dal dovolj sredstva, da gredo po več sredstev na svoje.
>> Torej, regularni izrazi pogledati v bistvu takole.
To je regularni izraz v Ruby.
Ni hudo medsebojno razlikujejo jezikov.
Imamo samo na poševnico začeti in označite regularnega izraza v Ruby.
In to je regularni izraz za iskanje v e-poštni naslov vzorcu.
Tako vidimo na prvi bit išče vse alfanumerični.
To je zato, ker so e-poštni naslovi pogosto začnejo s črko.
In potem vsak poseben znak sledi znakom @.
In potem isto stvar za domensko ime.
Nato pa med 2 in 4 znake za iskanje. Com,. Net, in tako naprej.
Tako da je še en primer redne izražanja.
Torej, regularni izrazi so protokoli za iskanje vzorcem; v besedilu.
Delajo primerjave, izbor, in zamenjav.
Torej Tretji primer je najti vse telefonske številke, ki se končajo v 54 v imenik.
Torej, preden David prask gor CS50 imenik lahko iščemo
vzorec, kjer imamo oklepaje nato 3 številke potem konec oklepajev,
Več številke 3, črtica, 2 številki, nato pa 54.
In to bi bilo bistveno, kako smo prišli do regularni izraz za iskanje za to.
>> Torej obstaja -, da smo naredili nekaj stvari v CS50, da so malce podobna
regularni izrazi, tako da - na primer - v dictionary.C datoteke
za preverjanje črkovanja problem niz lahko ste uporabili fscanf
brati v besedo iz slovarja.
In si lahko ogledate odstotek 45s išče niz 45 znakov.
Torej je nekako kot osnovno regularnega izraza.
In lahko imate 45 znakov, ki ustrezajo zakona tam
in izbrati tiste gor.
In potem drugi primer v zadnjem programskem problem web
postavljena v distro kodo za php smo dejansko imajo preprosto regularni izraz.
In to je samo preprosto videti, da preveri, če je spletna stran, ki je minilo v
ujema bodisi prijavi ali odjavi registrirati. PHP.
In potem vrne resnična ali neresnična, ki temelji na tem regularni izraz ujemanje.
>> Torej, ko boste uporabili regularni izraz?
Zakaj ste danes tukaj?
Torej ne želite uporabiti regularni izraz, če obstaja nekaj, kar
ne dela za vas še bolj enostavno.
Torej, XML in HTML so dejansko zelo zapleteno
pisati regularne izraze za, kot bomo videli v malo.
Torej obstajajo namenske razpoznavalniki za te jezike.
Prav tako morajo biti v redu s kompromisi in točnosti pogosto.
Če se potrudiš - tako smo videli regularni izraz za e-poštni naslov,
ampak pravijo, da je želel poseben e-poštni naslov in postopoma
regularni izraz morda postalo bolj zapleteno, kot je postalo bolj natančno.
Tako da bi bilo eno kompromis.
Moraš biti prepričani, da ste prav tako z redno izražanja.
Če veste, kaj iščete bi bilo bolj smiselno,
postaviti v čas in napisati bolj učinkovito parser.
In končno je zgodovinski problem z pravilnosti
izrazov in jezikov.
Regularni izrazi so dejansko veliko močnejša od
regularni izrazi na pravijo v formalnem smislu.
>> Torej, ne želim iti predaleč v formalno teorijo,
vendar je večina jezikov, ki smo koda v resnici niso pravilne.
In to je razlog, zakaj regularni izrazi se včasih ne šteje vse, da varno.
Torej v bistvu je Chomsky hierarhija za jezike,
in so regularni izrazi zgraditi z unijo, združevanje,
in delovanje Kleene zvezda, da bomo videli v nekaj minutah.
Če vas zanima v teoriji je zelo veliko dogaja tam pod pokrovom.
>> Tako kratko zgodovino - samo za kontekst tukaj - redna kompleti prišel gor
leta 1950, nato pa smo imeli preproste urednike, da
vključiti regularne izraze - samo iskanje nizov.
Grep - ki je orodje ukazne vrstice - je bila ena izmed prvih
Zelo priljubljena orodja, da vgrajeni regularne izraze v 1960.
V 80-ih je bil Perl zgrajena - je programski jezik, ki
vključuje regularne izraze zelo vidno.
In potem še pred kratkim smo imeli Perl združljiv regularni izraz
protokoli v bistvu v drugih jezikih, ki uporabljajo veliko enake sintakse.
Seveda je najbolj pomemben dogodek leta 2008
kjer je bil prvi dan državnosti regularnih izrazov,
kar menim, da je 1. junij, če želite, da proslavimo.
>> Še enkrat, samo malo bolj teorija tukaj.
Torej, obstaja nekaj različnih načinov gradnje regularne izraze.
En preprost način je, da zgraditi izraz, ki boste
teči na vrvico razlagajo - v bistvu zgraditi malo mini program, ki
bo analizirala kosov niz in videli, "Oh, ta ustreza regularni izraz, ali ne?"
In nato zaženite da.
Torej, če imate zelo majhno regularni izraz, to je verjetno
Najbolj učinkovit način, da to storite.
In potem, če vas - druga možnost je, da obnovi
izraz, kot si, in da je simulirajo možnost.
In teh zgodnjih poskusov na rednih algoritmov izražanja bilo
relativno enostaven in relativno hitro, vendar niso imeli veliko fleksibilnost.
Torej, da naredimo še nekaj stvari, da bomo pogled na
Danes smo morali narediti bolj zapleteno regularni izraz
izvedb, ki so potencialno veliko počasneje, tako da je nekaj imeti v mislih
Tam je tudi redna izrazi zanikanje napad sorte
da bi izkoristili potencial za teh novih izvedb
regularni izrazi, da je postala zelo zapletena.
In v skoraj istem smislu, da smo videli v buffer overflow napadi,
imate napade, ki delujejo pod imenom česar rekurzivnih zank,
Prekoračitev zmogljivost pomnilnika.
In mimogrede Regexen je eden od uradnih množinah redne izražanja
po analogiji volov v Anglo-Saxon.
>> Ok, tako da je knjižnica Python mnogi od vas tu v živo imajo Mace,
tako da lahko dejansko to uspe na zaslonu.
Regularni izrazi so vgrajeni v Python.
In tako je Python naložene v Mac in voljo tudi na spletu na tej povezavi.
Torej, če ste gledali ste lahko ustavite in poskrbite, da imate Python
kot smo igrati tukaj.
Obstaja elektronski priročnik, tako da če vpišete Python v računalnik
boste videli, da je verzija v terminalu.
Zato sem dala povezavo do priročnika za različico 2 Python, kakor tudi goljufija stanja.
Na voljo je različica 3 Python, vendar vaš Mac ni nujno
prihajajo z ki prednaložena.
Torej ni strašno drugačen.
Ok, nekaj osnov uporabe regularnih izrazov v Pythonu.
>> Torej, tukaj sem uporabil zelo preprost izraz, zato sem Python uvozni re
in potem je rezultat re.search.
In iskanje traja 2 argumente.
Prvi je regularni izraz, drugi pa je besedilo
ali niz želite analizirati.
In potem sem se natisne na result.group.
Torej, to sta 2 osnovne funkcije, ki jih bomo videli danes
pri učenju o regularnih izrazih.
Torej samo zrušijo ta regularni izraz tukaj
h in potem \ w in potem sem tako \ w samo sprejema nobenih abecedni znak tam.
Tako da tukaj iščemo za "h" in nato še črko
in potem m, tako da tukaj, ki bi ustrezal šunko
, «je Abraham Lincoln in šunka sendviči."
To je posledica te skupine.
Še ena stvar, ki jo lahko storimo, je uporaba naše pred nize besedila v Pythonu.
Torej, mislim, da bo šel naprej in potegnite, da je tu gor.
Python uvoz ponovno.
In če bi bil jaz narediti isto stvar - recimo besedilo,
»Abraham,« nam povečavo - tam gremo.
Besedilo je: »Abraham poje šunko."
Ok, in lahko privedlo = re.search.
In potem lahko naš izraz je h, nato pa bom naredil piko m.
Torej pika samo traja katerikoli znak, ki ni nova linija skupaj s številkami,
odstotne znaki, kaj podobnega.
In nato besedilo - bum - in potem result.group--ja.
Tako da je samo, kako izvajati osnovne funkcije tukaj.
Če bi imeli besedila prstan, da - to noro besedilo - Vključitev povedati veliko nazaj poševnico
in godala v notranjosti in stvari, ki lahko izgledajo kot sekvenc za izhod v sili,
potem bomo verjetno želeli uporabiti surovo pisanju se prepričajte, da je sprejet.
In to samo izgleda tako.
Torej, če smo iskali za vsako od njih pa ne smemo našli ničesar.
Ampak to je, kako bi jo izvajala; tik pred niz
regularni izraz daš črko R.
>> Ok, tako da nam nadaljuj.
Vse je v redu - tako si oglejmo nekaj ponavljajočih se vzorcev tukaj.
Torej, ena stvar, ki jo želite storiti, je, ponavljam stvari
kot ste iskanje po besedilu.
Torej, da ne sledi poljubno število b - ti ab *.
In potem so tu še vrsta drugih predpisov preveč.
In si lahko ogledate vse te gor, bom teči skozi nekaj
najpogosteje uporabljajo obstoječe.
Torej ab + je sledila katerikoli N večji od 0 točke b.
ab? je sledila 0 ali 1 v b.
ab {N} je sledila N b, in tako naprej.
Če imate 2 številke v zavitih oklepajih, ki ga določa vrsto
da se lahko morda ujemajo.
Tako da bomo videti bolj na nekaj ponavljajočih se vzorcev v minuto.
Torej 2 stvari, da v mislih, ko uporabljate te ujemanje vzorcev orodja tukaj.
Tako pravijo želimo pogledati na hm z "Abraham Lincoln naredi sendvičev s šunko."
Zato sem spremenila ime Abraham Lincoln je Abrahamu.
In zdaj iščemo, kaj se vrnila s to funkcijo iskanja,
in se vrne ham le v tem primeru.
In to, da je iskanje samo zato, ker seveda nima levi največ čakalne vrste.
In vsi regularni izrazi, razen če ni drugače določeno, to.
Če bi želeli, da bi našli vse, kar je funkcija za to - najti vse.
Tako da lahko samo videti vse = re.findall ("h.m", besedilo)
in nato all.group ().
Vse izdeluje šunko in šunko, v tem primeru obeh nizov v Abrahama stegna.
Tako, da je druga možnost.
>> Čudovito. Druga stvar, da v mislih je, da regularni izrazi se največji intuitivno.
Oglejmo si primer.
Uspelo nam je, da je skrajni levi iskanje tukaj, potem pa sem poskušal večji iskanje
z Kleene operaterja zvezdica.
Torej za "Abraham Lincoln naredi sendvičev s šunko," in sem dobil nazaj le
m kot rezultat.
Vzrok za to napako je bila, da sem lahko sprejmejo poljubno število
h, ker nisem navesti ničesar, da gredo med h in m.
Edini primer je, da je imela m - edini primeri tam z vm v njem
in poljubno število H je bilo le niz m.
Potem sem poskusil še enkrat, sem rekel: "V redu, preidimo dejansko največjo skupino tu."
In potem sem h. * M, tako da se samo vrne poljubno število znakov, med h in m.
In če ste šele začeli in si mislil: "Oh, v redu, dobro bo to
daj mi pršut, "je v resnici traja vse od hv Abrahama Lincolna
vse tja do konca šunke.
To je požrešen, ampak vidi h - vse to drugo besedilo - m,
in to je tisto, kar je potrebno noter
To je še posebej nezaslišane - to je značilnost smo lahko tudi
navedite za to ne bodi pohlepen uporabo drugih funkcij.
Ampak to je nekaj, kar moramo imeti v mislih predvsem
ko gledaš HTML besedilu, ki je eden od razlogov, da
regularne izraze je težko za HTML.
Ker če imate HTML odprto oznako in nato še mnogo stvari v sredini
in še nekaj drugih HTML zaprta oznako mnogo kasneje v programu,
ste pravkar pojedli veliko kode HTML morda po pomoti.
>> Vse pravice - tako bolj posebnih znakov, tako kot mnoge druge jezike,
smo pobegnili z poševnice.
Tako da bomo lahko uporabite piko določite katerikoli znak, razen za novo linijo.
Mi lahko uporabite ubežni w določite vsako črko.
In po analogiji pobega d za celo število - numerični znak.
Mi lahko navedete - lahko uporabimo oklepaje določiti sorodne izraze.
Tako da bi to sprejeli, b, ali c.
In bomo lahko tudi določite, ali možnosti za bodisi A ali B.
Na primer - če bomo iskali več možnosti
v oklepaju, bi lahko uporabite ali subjekta, kot v -
Tako vrnimo se k temu primeru tukaj.
In zdaj nam bo - vrnimo se k temu primeru tukaj in nato
sprejmejo AE - zato je treba to vrniti - Mislim, da je to še Abraham.
Torej je to - če bomo vsi - super.
Torej nam posodobiti besedilo tukaj.
»Abraham poje šunko pa HEMMING svoje -. Medtem ko robljenje" Čudovito.
Vse. Čudovito. Zdaj smo dobili pršut, šunka, in robom.
Medtem ko robljenje - medtem pela z njim - pa brenčanje, da ga robu. Čudovito.
Ista stvar.
Zdaj vse vrne vedno samo pršut, šunka in rob brez pobral na hum ali zanj.
Great - Pa kaj, če smo želeli pogledati niti tega, da - tako bi lahko tudi to
on ali - se bomo vrnili k temu.
Ok - tako - vse v redu - na položajih, ki jih lahko uporabite tudi strešica ali znak za dolar
navesti, da iščete nekaj, kar na začetku ali na koncu niza.
Ali začetek ali konec besedi.
To je eden od načinov za uporabo tega.
>> Ok - tako nam igral z nekoliko večji blok besedila.
Recimo to vrstico tu - to izjavo tukaj.
Moč regularnem izrazu, ki jih lahko podate vzorce
ne samo določene znake.
Dovolite nam, da - bodimo to imenujemo blok.
Potem bomo prebrali vse to noter
In potem - da nam bo vse =, kaj so nekatere stvari, ki jih lahko poiščete tukaj donosno?
Lahko bi si za izražanje uho.
Ni zelo zanimivo. Kaj pravite na to? Bomo videli, kaj se bo zgodilo.
Sem dal to težavo.
Torej, vse več stvari, preden ponovno in vse.
Tako da bi se morali vrniti vse od začetka spremljanja vseh ponovni morda nekaj krat.
In potem imamo tu moč regularnih izrazov je, da
lahko določite vzorcev ne le znaki so tukaj.
Torej, vse tja do končnega ponovno, se je začelo z levo večino in je bil pohlepen.
Poglejmo - kaj še lahko iščemo.
Mislim, da eno stvar, če ste bili zainteresirani pri iskanju zaimkom ona in on,
bi lahko preveri s, enak 0 ali 1
in izraz je, in da se verjetno ne bo vrnil -
oh, mislim, da se vrne on, ker smo iskali na moči, da dan, tukaj so.
Poskusimo z navedbo, da je to, da pridejo na začetku nečesa.
Poglejmo, če pade.
Tako da lahko naredimo maščobe, in tam ne bomo dobili ničesar, ker je bil
ne pojavljajo v tem stavku.
Čudovito. Ok - tako nazaj na mačko tukaj.
Tako kompleksne vzorce je poškodoval možgane.
Tako, da je razlog, zakaj jih uporabljamo regularne izraze, da bi se izognili teh vprašanj.
>> Torej, tukaj so nekatere druge koristne načine lahko igrate z okoli.
Ogledali smo si iskanjem danes, lahko pa uporabite tudi tekmo, Split, findall in skupin.
Torej druge kul stvari lahko storite z regularnimi izrazi poleg pravkar
iskanje vzorcev jemlje vzorec in ima vse tekme -
njegove spremenljivke - in nato z uporabo tistih v kodi kasneje.
To je lahko zelo koristna. Druge stvari, lahko računamo.
Tako, da lahko računamo na število primerkov vzorec regularnega izraza,
in to je tisto, kar smo lahko uporabite skupinami.
In druge vrste pa so tudi možne.
Torej, jaz samo želim, da govori malo več o drugih načinih, ki jih lahko uporabite regularne izraze.
>> Torej, še ena napredna uporaba je v mehke ujemanje.
Torej, če iščete besedilo za izražanje, Julius Caesar,
in boste videli bodisi Gaj Julij Cezar ali ime Julij Cezar v drugih jezikih,
potem boste morda želeli, da dodelijo določeno težo te vrednote.
In če je dovolj blizu - če prečka določen prag - potem hočeš
biti sposoben sprejeti Julija Cezarja.
Torej, obstaja nekaj različnih izvedb za to je v nekaj drugih jezikih, kot dobro.
Tukaj je nekaj drugih orodij, Regex Pal - priročen mali app na spletu, da
preverite, ali so vaši regularni izrazi pravilno sestavljena.
Obstajajo tudi samostojni orodja, ki lahko delujejo na namizju
kot Ultra Pico, in pa tudi samo kuharske knjige.
Torej, če delaš projekt, ki vključuje tone regularnih izrazov
to je verjetno kraj za iti zunaj obsega danes.
In potem samo, da vam občutek, kako pogosti, da je
je grep v Unix, Perl ima vgrajeno in C je PCRE za C.
In potem vsi ti jeziki imajo tudi regularni izraz pakete
ki delujejo s bistvu isto sintakso smo dobili okus danes.
PHP, Java, Ruby, in tako naprej.
>> Google Code Search je dejansko vredno omeniti, da je eden od
sorazmerno malo vlog tam, ki omogoča javnosti dostop
njegova baza uporabo regularnih izrazov.
Torej, če pogledaš na Google Code Search lahko najdete kodo
Če iščete na primer o tem, kako bi lahko bila uporabljena funkcija,
lahko uporabite regularni izraz, da bi našli, ki se uporabljajo v vse vrste različnih primerov to funkcijo.
Lahko bi si za fwrite, nato pa bi morali iskati zastavo pisati ali brati
če bi želel primer fwrite se uporablja v tem primeru.
Torej isto stvar tam in tukaj je nekaj referenc.
Ta bo na voljo tudi na spletu, tako da gredo naprej, če
želite pogledati Python, grep, Perl - si samo želim, da bi dobili nekaj navdiha
ali če želite videti več na teoriji tukaj je nekaj dobro skakali mestih.
Najlepša hvala.
[CS50.TV]