[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]