[Powered by Google Translate] [Seminārs: Pattern saskaņošana ar regulārām izteiksmēm]
[John Mussman-Harvard University]
[Tas ir CS50.-CS50.TV]
Labi. Nu, welcome ikviens. Tas ir CS50 2012.
Mans vārds ir Jānis, un es būs runāt šodien par regulārām izteiksmēm.
Regulāras izteiksmes ir galvenokārt līdzeklis, bet arī dažreiz izmanto
kodā aktīvi būtībā atbilstu modeļus un stīgas.
Tātad, šeit ir tīmekļa komikss no XKCD.
Šajā komikss ir slepkavība noslēpums kur killer ir
seko kāds atvaļinājumā, un galvenie varoņi ir
pārlūkot 200 megabaitu e-pastiem, kas meklē adresi.
Un viņi ir gatavi padoties, ja kāds, kurš zina, regulāras izteiksmes -
iespējams supervaronis - kritīs lejup uz leju un raksta daži kodu
un atrisina slepkavības noslēpumu.
Tātad iespējams, ka būs kaut kas jums būs pilnvarota to darīt
Pēc šī semināra.
Mēs esam tikai gatavojas sniegt īsu ievadu valodu
un jums ir pietiekami līdzekļi, lai iet pēc vairāk resursu par savu.
>> Tātad, regulāras izteiksmes izskatās būtībā kā šis.
Tas ir regulāra izteiksme Ruby.
Tas nav briesmīgi atšķirīgs dažādās valodās.
Mums ir tikai par simbolos, lai sāktu un atzīmējiet regulāro izteiksmi Ruby.
Un tas ir regulāra izteiksme, lai meklētu e-pasta adresi modeli.
Tā mēs redzam, pie pirmās mazliet meklē jebkuru burtciparu rakstzīmi.
Tas ir tāpēc, ka e-pasta adreses bieži vien ir jāsāk ar alfabēta burts.
Un tad kāds īpašais raksturs seko @ simbolu.
Un tad pats par domēna nosaukumu.
Un tad starp 2 un 4 rakstzīmes meklēt. Com, net,. Un tā tālāk.
Tātad tas ir vēl viens piemērs regulāras izteiksmes.
Tātad, regulāras izteiksmes ir protokoli, lai atrastu patters tekstā.
Viņiem salīdzinājumus, atlasi, un nomaiņu.
Tātad Trešais piemērs ir atrast visus tālruņu numurus, kas beidzas ar 54 direktorijā.
Tātad, pirms David RIP augšup pa CS50 direktorijā, mēs varētu meklēt
modelis, kur mums ir iekavas, tad 3 numurus, tad beigās iekavās,
3 un vairāk numurus, domuzīme, 2 numuri, un pēc tam 54.
Un tas būtu būtiski, kā mēs nākam klajā ar regulāru izteiksmi, lai meklētu to.
>> Tā ir - mēs esam darījuši dažas lietas, CS50, ka ir mazliet kā
regulāras izteiksmes, tāpēc - piemēram, - šajā dictionary.C failā
par pareizrakstības pārbaudi problēmu kopumu, jums var būt izmantoti fscanf
lasīt vārdu no vārdnīcas.
Un jūs varat redzēt procents 45s meklē virkni 45 rakstzīmes.
Tātad, tas ir nedaudz, piemēram, rudimentāru regulāras izteiksmes.
Un jūs varat būt kādi 45 rakstzīmes, kas fit rēķinu tur
un izvēlēties tos uz augšu.
Un tad otrs piemērs jaunākajā web programmēšanas problēmu
noteikts distro kodu php mums patiešām ir vienkārši regulāra izteiksme.
Un tas viens ir vienkārši vēlas, lai pārbaudītu, vai mājas lapa, kas tiek nodota
atbilst vai nu piesakieties vai logout reģistrā. PHP.
Un tad atgriežas patiess vai nepatiess, pamatojoties uz šo regulāru izteiksmi iekārtošanu.
>> Tātad, ja jūs izmantojat regulāru izteiksmi?
Kāpēc jūs šeit šodien?
Tātad, jūs nevēlaties izmantot regulāras izteiksmes, ja tur ir kaut kas
dara to darbu jums, pat vieglāk.
Tātad, XML un HTML ir faktiski diezgan grūts
rakstīt regulāras izteiksmes, lai kā mēs redzēsim mazliet.
Tātad ir veltīta parsers par šīm valodām.
Jūs arī ir nepieciešama, lai būtu labi ar kompromisus un precizitāti bieži.
Ja jūs mēģināt, - lai mēs redzējām regulāru izteiksmi uz e-pasta adresi,
bet saka, jūs vēlētos īpašu e-pasta adresi un pakāpeniski
regulāra izteiksme varētu kļūt sarežģītāka, jo tā kļuva precīzāki.
Tātad tas būtu viens tirdzniecības off.
Jums ir jābūt pārliecinātiem, ka jums ir labi pelnīt ar regulāru izteiksmi.
Ja jūs zināt, tieši to, ko jūs meklējat, tas varētu daudz lietderīgāk
īstenot laiku un rakstīt efektīvāku parsētājs.
Un visbeidzot ir vēsturisks jautājums, ar regularitāti
izpausmes un valodu.
Regulāras izteiksmes faktiski ir daudz spēcīgāks nekā
regulāras izteiksmes vienu teikt formāli.
>> Tāpēc es negribu iet pārāk tālu uz oficiālu teoriju,
bet lielākā daļa valodas, mēs kods patiesībā nav pareizi.
Un tas ir iemesls, kāpēc regulāras izteiksmes dažkārt netiek uzskatīts viss, kas droši.
Tātad būtībā ir Chomsky hierarhija valodām,
un regulāras izteiksmes ir veidot, izmantojot savienību, konkatenācijas,
un to Kleene zvaigžņu darbību, ka mēs redzēsim pēc dažām minūtēm.
Ja Jūs interesē teorētiski ir diezgan daudz tur notiek saskaņā ar kapuci.
>> Tik īsu vēsturi - tikai kontekstā šeit - regulāras komplekti nāca klajā
1950, un tad mums bija vienkārši redaktori, ka
jāiekļauj regulāras izteiksmes - vienkārši meklējot stīgām.
Grep - kas ir komandrindas rīks - bija viens no pirmā
ļoti populārs instrumenti, kas iekļauti regulāras izteiksmes 1960.
In '80s, Perl tika uzcelta - ir programmēšanas valoda, kas
ietver regulāras izteiksmes ļoti pamanāmi.
Un tad vēl nesen mums bija Perl saderīgu regulāru izteiksmi
protokoli galvenokārt citās valodās, kas izmanto daudz to pašu sintaksi.
Protams, svarīgākais notikums bija 2008
kur bija valsts pirmais Regular Expressions diena,
kas, manuprāt, ir jūnijs 1 Ja jūs vēlaties, lai svinētu to.
>> Atkal, tikai nedaudz vairāk teorija šeit.
Tātad ir pāris dažādi veidi, būvniecības regulāras izteiksmes.
Viens vienkāršs veids ir veidot izteiksmi, ka jūs gatavojaties
palaist uz virkni interpretēt - būtībā veidot maz mini-programmu, kas
analizēs gabalus stīgu un redzēt, "Ak, tas ietilptu regulāru izteiksmi, vai ne?"
Un tad palaist to.
Tātad, ja jums ir ļoti maza regulāru izteiksmi, tas ir iespējams,
visefektīvākais veids, kā to darīt.
Un tad, ja jūs - vēl viena iespēja ir, lai saglabātu rekonstruējot
izteiksme, kā jums iet, un tas ir simulēt iespēja.
Un šie agri mēģinājumi regulāras izteiksmes algoritmiem, bija
salīdzinoši vienkārši un salīdzinoši ātri, bet nebija lielu elastību.
Tātad, lai darīt vēl dažas lietas, ko mēs gatavojamies apskatīt
šodien mums bija darīt vairāk sarežģītu regulāru izteiksmi
implementācijas, kas ir potenciāli daudz lēnāk, tāpēc tas ir kaut kas jāpatur prātā
Ir arī regulāras izteiksmes noliegums uzbrukuma šķirnes
ka izmantot iespējas šiem jaunāku implementāciju
regulāras izteiksmes, lai kļūtu ļoti sarežģīta.
Un daudz pašā nozīmē, ka mēs redzējām bufera pārpildes uzbrukumiem,
Jums ir uzbrukumi, kas darbojas, padarot rekursīvas cilpas, ka
pārsniegts jaudas atmiņas.
Un ar to, kā Regexen ir viens no oficiālajām daudzskaitļus regulāras izteiksmes
pēc analoģijas ar vēršiem tajā anglosakšu.
>> Labi, tā Python bibliotēka daudzi no jums šeit personīgi ir Mac,
lai jūs faktiski var pull šo up ekrānā.
Regulāras izteiksmes ir iebūvēts Python.
Un tā Python tiek ielādētas uz Mac, un arī pieejams interneta vietnē šīs saites.
Tātad, ja jūs skatītos varat pauzēt un pārliecinieties, ka Jums ir Python
kā mēs spēlējam šeit tuvumā.
Ir tiešsaistes rokasgrāmatu, tādēļ, ja jūs vienkārši ierakstiet Python datorā
Jūs redzēsiet, ka versija nāk klajā terminālī.
Tāpēc es sniedz saiti uz rokasgrāmatā par Python 2 versija, kā arī apkrāptu loksnes.
Ir 3 versija Python, bet jūsu Mac nav obligāti
nāk ar to ielādētas.
Tātad nav briesmīgi atšķirīgs.
Labi, tāpēc daži pamati, izmantojot regulāras izteiksmes Python.
>> Tātad, šeit es ļoti vienkāršu izteiksmes, tāpēc es darīju Python importa re
un pēc tam ņēma rezultātu re.search.
Un meklēt aizņem 2 argumentus.
Pirmais ir regulāra izteiksme, un otrais ir teksta
vai string jūs vēlaties, lai analizētu.
Un tad Es izdrukāt out result.group.
Tātad šie ir 2 galvenās funkcijas mēs gatavojamies šodien redzam
mācīšanās par regulārām izteiksmēm.
Tik vienkārši salaužot šo regulāro izteiksmi šeit
h un pēc tam \ w un tad esmu tik \ w vienkārši akceptē jebkādu burtam tur.
Tātad, šeit mēs meklējam "h" un tad vēl alfabēta burtu
un tad m, tāpēc šeit, kas atbilstu šķiņķis
kas, "Abraham Lincoln un šķiņķi sviestmaizes."
Tas ir rezultāts šajā grupā.
Vēl viena lieta, ko mēs varam darīt, ir izmantot mūsu pirms teksta virknes Python.
Tāpēc es domāju, es iet uz priekšu un velciet, ka šeit.
Python importa re.
Un, ja man bija darīt to pašu - teiksim teksts ir,
"Ābrahāms," ļaujiet mums pietuvinātu - tur mēs ejam.
Teksts ir, "Ābrahāms ēd šķiņķis".
Labi, tad rezultāts = re.search.
Un tad mūsu izteiksme var būt h, un pēc tam es do dot m.
Tik dot tikai ņem jebkuru rakstzīmi, kas nav jauna līnija, ieskaitot numurus,
procentu zīmes, kaut kā tā.
Un tad teksts - bums - un tad result.group--jā.
Tātad tas ir tikai to, kā īstenot pamata funkcionalitāti šeit.
Ja mums bija teksta gredzenu, ka - kas traks tekstu - iekļauta teikt daudz atpakaļ simbolos
un virknes iekšpusē un lietas, kas varētu izskatīties evakuācijas sekvences,
tad mēs, iespējams, vēlas izmantot izejvielas teksta ievadi, lai pārliecinātos, ka ir pieņemts.
Un tas tikai izskatās, ka.
Tātad, ja mēs meklējam katru no tiem, kas tur mums nevajadzētu atrast neko.
Bet tas ir, kā jūs varētu īstenot, tikai pirms virkne
regulāra izteiksme jūs nodot burtu r.
>> Labi, tāpēc ļaujiet mums saglabāt turpinās.
Visas tiesības - tāpēc ļaujiet mums apskatīt pāris atkārtojas modeļiem šeit.
Tik viena lieta, ko vēlaties darīt, ir atkārtot lietas
kā jūs meklēt, izmantojot tekstu.
Tātad, lai darīt seko jebkurš skaits b - jūs ab *.
Un tad tur ir citi noteikumi virkne too.
Un jūs varat apskatīt visus šos up, es ņemšu tikai palaist caur kādu no
Visbiežāk izmanto ones.
Tā AB + ir neseko kāds N ir lielāks par 0 un b.
ab? ir kam ar 0 vai 1 un b.
ab {N} ir kam ar N no B, un pēc tam tā tālāk.
Ja jums ir 2 numurus, cirtaini lencēm jūs norādot diapazonu
kas var būt iespējams saskaņota.
Tāpēc mēs izskatās vairāk pēc pāris atkārtotiem modeļus minūti.
Tātad 2 lietas, kas jāpatur prātā, izmantojot šo rakstu saskaņošanas instrumentus šeit.
Tā teikt, mēs vēlamies apskatīt HM ir, "Abraham Lincoln padara šķiņķa sviestmaizes."
Tāpēc es mainīja Abraham Lincoln nosaukumu uz Ābrahāmu.
Un tagad mēs meklējam to, kas tiek atgriezta šī meklēšanas funkciju,
un tas tikai atgriež šķiņķa šajā gadījumā.
Un tas, ka tāpēc, ka meklētājprogrammas tikai dabiski notiek kreiso visvairāk rindā.
Un visi regulāras izteiksmes, ja norādāt citādi būs jādara.
Ja mēs vēlējāmies, lai atrastu visu, kas ir par šo funkciju - atrast visu.
Tā, ka var tikai izskatās visu = re.findall ("h.m", teksts)
un pēc tam all.group ().
Visi ražo gan šķiņķi un šķiņķi, šajā gadījumā gan no šajā Ābrahama stīgas šķiņķa.
Tāpēc, ka ir vēl viena iespēja.
>> Lieliski. Otra lieta, kas jāpatur prātā, ir tas, ka regulāras izteiksmes veikt lielāko intuitīvi.
Ļaujiet mums skatīties uz šo piemēru.
Mēs to darījām, ka atstāja lielākā meklēt šeit, un tad es mēģināja lielāku meklēšanu
izmantojot Kleene zvaigžņu operatoru.
Tātad, "Abraham Lincoln liek šķiņķa sviestmaizes," un es tikai got atpakaļ
m, kā rezultātā.
Par šo kļūdu iemesls bija tas, ka es varētu būt veikusi jebkādu skaitu
h ir tāpēc, ka man nav jānorāda kaut ko braukt starp h un m.
Vienīgais piemērs, kas tur, kas bija m - vienīgie piemēri tur ar m tajā
un jebkura h s skaits bija tikai virkne m.
Tad es mēģināju vēlreiz, es teicu: "Labi, ļaujiet mums saņemt faktisko lielākā grupa šeit."
Un tad es did h. * M, lai atgrieztos jebkuru rakstzīmju skaitu starp H un m.
Un, ja Jums ir tikko sākusies, un domā: "Ak, labi, labi tas
atnesiet man šķiņķis ", tā faktiski veic visu, sākot no h Abraham Lincoln
visu ceļu līdz beigām šķiņķa.
Tas ir mantkārīgs, tas redz h - tas viss cits teksts - m,
un tas ir tas, ko tā veic collas
Tas ir īpaši neredzēts - tā ir iespēja, mēs varam arī
norādīt tā nav mantkārīgs, izmantojot citas funkcijas.
Bet tas ir kaut kas mums ir jāpatur prātā, jo īpaši
aplūkojot HTML tekstu, kas ir viens no iemesliem, kas
regulāras izteiksmes ir grūti HTML.
Jo, ja jums ir HTML atklātu tagu, un tad daudz stuff vidū
un pēc tam daži citi HTML slēgtas tag daudz vēlāk programmā,
tikko esat ēdis pat daudz jūsu HTML kodu, iespējams, kļūdas dēļ.
>> Visas tiesības - tik daudz speciālās rakstzīmes, tāpat kā daudzās citās valodās,
mēs izvairīties, izmantojot slīpsvītru.
Tātad, mēs varam izmantot dot, lai norādītu jebkuru rakstzīmi, izņemot jaunu līniju.
Mēs varam izmantot glābšanās W, lai norādīt jebkuru burtam.
Un pēc analoģijas evakuācijas D vesels skaitlis - skaitliskā raksturs.
Mēs varam norādīt - mēs varam izmantot iekavas, lai norādītu saistītus izteiksmes.
Tātad tas varētu pieņemt, B vai c.
Un mēs varam arī norādīt, vai iespējas, vai nu a vai b.
Piemēram - ja mēs meklējam vairākiem iespējām
Iekavās mēs varētu izmantot vai operatoru, kā arī -
tāpēc ļaujiet mums iet atpakaļ uz šo piemēru šeit.
Un tagad ļaujiet mums uzņemties - ļaujiet mums iet atpakaļ uz šo piemēru šeit, un pēc tam
veikt AE - tā tas būtu jāatgriežas - Es domāju, tas joprojām ir Ābrahams.
Tātad, tas ir - ja mēs visi - lieliski.
Tātad, ļaujiet mums atjaunināt tekstu šeit.
"Ābrahāms ēd šķiņķi, kamēr hemming viņa -. Kamēr hemming" Lieliski.
Viss. Lieliski. Tagad mēs šķiņķis, šķiņķis, un hem.
Kaut hemming - kamēr kolibri ar viņu - bet kolibri hem viņu. Lieliski.
Pats.
Tagad viss atgriežas vēl tikai šķiņķis, šķiņķis, un hm bez pacelt uz hum vai viņa klātbūtnē.
Lielā - Tad ko, ja mēs vēlējāmies, lai apskatīt, vai nu ka - lai mēs varētu arī darīt
viņam vai - mēs atgriezīsimies pie tā.
Labi - tā - viss kārtībā - amatos, jūs varat izmantot arī caret vai dolāra zīmi
, lai norādītu, ka jūs meklējat sākumā, kaut vai virknes beigām.
Vai sākuma vai no vārda gals.
Tas ir viens veids, kā izmantot to.
>> Labi - tāpēc ļaujiet mums spēlēt aptuveni ar nedaudz lielāku teksta bloku.
Teiksim šo rindu šeit - šo paziņojumu šeit.
Regulāri izteiksmes spēks ir tas, ka viņi var norādīt modeļus
ne tikai noteikta rakstzīmes.
Ļaujiet mums padarīt - sauksim šo bloku.
Tad mēs lasīt visu, kas iekšā
Un tad ir - ļaujiet mums darīt visu =; tā, kādi ir dažas lietas, ko mēs varētu meklēt šeit izdevīgi?
Mēs varētu meklēt izteiksmes auss.
Ne ļoti interesanti. Kā par to? Redzēsim, kas notiks.
Man bija tā problēma.
Tāpēc jebkurš vairākas lietas, pirms re un viss.
Tā, ka vajadzētu atgriezties viss no sākuma līdz pat visiem re varbūt pāris reizes.
Un pēc tam šeit mums ir no regulāras izteiksmes spēks ir tāds, ka tie
var norādīt modeļus ne tikai varoņi šeit ir.
Tātad, visu ceļu līdz gala re, tas sākās ar kreiso visvairāk un bija mantkārīgs.
Ļaujiet mums redzēt - ko vēl mēs varētu meklēt.
Es domāju, viena lieta, ja jūs interesē meklē vietniekvārdu viņa un viņš,
jūs varētu pārbaudīt s ir vienāds ar 0 vai 1
un izteiksmes viņš, un tas, iespējams, nav gatavojas atgriezties -
ak, es domāju, ka atpakaļ viņš tāpēc, ka mēs meklējam pie varas, ka dienā, šeit ir.
Ļaujiet mums mēģināt norādot, ka tas ir jānāk sākumā kaut ko.
Ļaujiet mums redzēt, ja tas nokrītas.
Tātad, mēs varam darīt, taukus, un tur mēs nesaņem neko, jo viņa un viņš
nav sastopami šo frāzi.
Lieliski. Labi - lai atpakaļ uz kaķa šeit.
Tātad sarežģītiem modeļiem nodara kaitējumu smadzenēm.
Tātad, tas ir iemesls, kāpēc mēs izmantot regulāras izteiksmes, lai izvairītos no šīs problēmas.
>> Tātad, šeit ir daži citi noderīgi veidi, jūs varat spēlēt aptuveni ar.
Mēs paskatījās meklēšanas šodien, bet jūs varat arī izmantot mačs, split, findall, un grupas.
Tātad citas labas lietas jūs varat darīt ar regulārām izteiksmēm turklāt tikai
meklē modeļus veic modeli un turot visas spēles -
tās mainīgie - un tad, izmantojot tos savu kodu vēlāk.
Tas var būt diezgan noderīga. Citas lietas var skaitīšanas.
Tātad, mēs varam rēķināties gadījumu skaitu regulāru izteiksmi modeli,
un tas ir tas, ko mēs varam izmantot grupas par.
Un citiem transporta veidiem, kā arī ir arī iespējams.
Tāpēc es tikai gribu runāt mazliet vairāk par citiem veidiem, kā jūs varat izmantot regulāras izteiksmes.
>> Tātad vēl viens progresīva ir izplūdušas iekārtošanu.
Tātad, ja jūs meklējat tekstu izteiksmes, Julius Caesar,
un jūs redzat, vai nu Gajs Jūlijs Cēzars vai nosaukumu Julius Caesar citās valodās,
tad jūs varētu arī vēlaties piešķirt kādu nozīmi šīm vērtībām.
Un, ja tas ir pietiekami tuvu, - ja tas šķērso noteiktu slieksni - tad jūs vēlaties
lai varētu pieņemt Jūlijs Cēzars.
Tātad ir pāris dažādas implementācijas, ka pēc pāris citās valodās, kā arī.
Šeit ir daži citi instrumenti, regex Pal - parocīgs maz app internetā, lai
pārbaudītu, vai jūsu regulāras izteiksmes sastāv pareizi.
Ir arī savrupajam instrumenti, kas var palaist no darbvirsmas
piemēram, Ultra Piko, un kā arī tikai pavārgrāmatas.
Tātad, ja jūs darāt projektu, kas ietver ton regulāras izteiksmes
tas ir iespējams, ir vieta, kur iet ārpus šodien.
Un tad tikai, lai dotu jums sajūtu par to, cik bieži tas ir
ir grep Unix, Perl ir iebūvēts, un C ir PCRE uz C.
Un tad visi šie citas valodas ir arī regulāras izteiksmes paketes
kas darbojas ar būtībā tādu pašu sintaksi mēs saņēmām garšu šodien.
PHP, Java, Ruby, un tā tālāk.
>> Google Code Search ir tiešām vērts pieminēt, tas ir viens no
salīdzinoši maz pieteikumu, kas pastāv, kas ļauj sabiedrībai, lai piekļūtu
tās datu bāzē, izmantojot regulāras izteiksmes.
Tātad, ja paskatās uz Google Code Search, jūs varat atrast kodu
Ja jūs meklējat, piemēram, kā funkciju varētu izmantot,
Jūs varat izmantot regulāras izteiksmes, lai atrastu, ka funkcijas tiek izmantoti visos dažādos gadījumos veidu.
Jūs varētu meklēt fwrite, un tad jūs varētu meklēt karogu rakstīt vai lasīt
ja vēlaties piemēru fwrite tiek izmantots šajā lietā.
Tātad pats tur, un šeit ir dažas atsauces.
Tas būs pieejams tiešsaistē, kā arī, lai iet uz priekšu, ja
Jūs vēlaties apskatīt Python, grep, Perl - jūs vienkārši vēlaties iegūt kādu iedvesmu
vai, ja jūs vēlaties, lai izskatās vairāk uz teoriju šeit ir dažas labas jumping off vietās.
Liels paldies.
[CS50.TV]