[Powered by Google Translate] [Семінар: шаблоне з выкарыстаннем рэгулярных выразаў] [Джон Mussman-Гарвардскі універсітэт] [Гэта CS50.-CS50.TV] Добра. Ну, дабро запрашаем ўсім. Гэта CS50 2012 года. Мяне клічуць Джон, і я буду гаварыць сёння аб рэгулярных выразах. Рэгулярныя выразы ў першую чаргу інструмент, але таксама часам выкарыстоўваецца у кодзе актыўна, па сутнасці, якія супадаюць з шаблонамі і радкоў. Такім чынам, вось вэб-камічнай ад XKCD. У гэтым коміксе ёсць таямніца забойства, дзе кілер наступным хтосьці ў адпачынку, і героі павінны пошук у 200 мегабайт лістоў пошуку адрасы. І яны збіраюцца здавацца, калі хтосьці, хто ведае рэгулярныя выразы - Меркавана супергероя - налятае і запісвае некаторы код і вырашае таямніцу забойства. Таму па-відаць, што будзе тое, што вы будзеце мець магчымасці рабіць Пасля гэтага семінара. Мы проста збіраемся, каб служыць кароткім увядзеннем у мову і даць вам дастаткова сродкаў, каб пайсці пасля вялікіх рэсурсаў па сваім меркаванні. Так рэгулярных выразаў глядзіце ў асноўным, як гэта. Гэта рэгулярны выраз у Ruby. Гэта не занадта адрозніваецца ў розных мовах. У нас ёсць толькі на касую рысу, каб пачаць і адзначце рэгулярных выразаў у Ruby. І гэта рэгулярны выраз для пошуку ў электроннай пошце шаблон адрасы. Такім чынам, мы бачым у першы біт шукае любыя алфавітна-лічбавыя сімвалы. Гэта таму, што адрасы электроннай пошты часта даводзіцца пачынаць з алфавіту. І то любы спецыяльны сімвал, наступны за сімвалам @. А потым тое ж самае для даменных імёнаў. А потым ад 2 да 4-х знакаў, каб шукаць. COM,. Сеткі, і гэтак далей. Так што гэта яшчэ адзін прыклад рэгулярнага выразы. Так што рэгулярныя выразы з'яўляюцца пратаколы для знаходжання шаблоны ў тэксце. Яны робяць параўнання, выбару і замены. Так што трэці прыклад знаходзіць усё тэлефонныя нумары, якія сканчаюцца ў 54 у каталогу. Таму, перш чым Дэвід рипы да CS50 каталога мы маглі шукаць шаблон, у якім у нас ёсць дужкі, затым 3 лічбы, а затым скончыць дужках, Яшчэ 3 нумары, працяжнік, 2 нумары, а затым 54. І гэта было б па сутнасьці, як мы прыдумалі рэгулярны выраз для пошуку для гэтага. Так што ёсць - мы зрабілі некаторыя рэчы ў CS50, якія трохі, як рэгулярных выразаў, а значыць - да прыкладу - у dictionary.C файл для Пастаўленая задача праверкі правапісу вы, магчыма, выкарыстоўвалі fscanf чытаць ў слова з слоўніка. І вы можаце бачыць працэнт 45s шукае радок з 45 знакаў. Такім чынам, гэта нешта накшталт элементарнага рэгулярнага выразы. І вы можаце мець любыя 45 знакаў, якія адказваюць усім патрабаванням там і выбраць тыя ўверх. А потым у другім прыкладзе ў апошняй праблеме вэб-праграмавання усталяваны ў дыстрыбутыве PHP код мы на самай справе ёсць простае рэгулярны выраз. А гэты проста проста хочаце праверыць, калі вэб-старонка, якая перадаецца ў супадае альбо з уваходам або выхадам зарэгіструйцеся. PHP. , А затым вяртаюцца сапраўдным або ілжывых, што на аснове рэгулярных выразаў. Таму, калі вы выкарыстоўваеце рэгулярныя выразы? Чаму вы тут сёння? Значыць, вы не хочаце выкарыстоўваць рэгулярныя выразы, калі ёсць што-то, што робіць усю працу за вас, нават больш лёгка. Так XML і HTML на самай справе даволі складана пісаць рэгулярныя выразы для, як мы ўбачым у няшмат. Такім чынам, ёсць вылучаны парсер для гэтых моў. Вы таксама павінны быць у парадку з кампрамісы і дакладнасць часта. Калі вы спрабуеце - такім мы ўбачылі рэгулярны выраз для адрасу электроннай пошты, але кажуць, што вы хацелі канкрэтны адрас электроннай пошты і паступова Рэгулярны выраз можа стаць больш складаным, паколькі гэта стала больш дакладным. Так што было б адным кампрамісам. Вы павінны быць упэўнены, што вы добра рабіць з рэгулярным выразам. Калі вы сапраўды ведаеце, што вы шукаеце для яго можа зрабіць больш сэнсу каб забіць час, і пісаць больш эфектыўны аналізатар. І, нарэшце, гістарычны пытанне з рэгулярнасцю выразаў і моў. Рэгулярныя выразы на самай справе значна больш магутным, чым рэгулярных выразаў за, кажуць у фармальным сэнсе. Так што я не хачу заходзіць занадта далёка ў фармальную тэорыю, але большасць моў, што мы на самай справе ў кодзе не зьяўляюцца рэгулярнымі. І менавіта таму рэгулярныя выразы часам не лічаць, што ўсё бяспечна. Так у асноўным існуе іерархія Хомскага да моў, і рэгулярныя выразы будуюцца з выкарыстаннем аб'яднання, канкатэнацыі, і аперацыя зорка Клін, што мы ўбачым праз некалькі хвілін. Калі вы зацікаўлены ў тэорыі маецца даволі шмат там адбываецца пад капотам. Так коратка гісторыю - як раз для кантэксту тут - рэгулярныя мноства прыдумаў У 1950-х гадах, а затым у нас былі простыя рэдактары, якія ўключаны рэгулярныя выразы - проста пошук радкоў. Grep - які з'яўляецца інструментам каманднага радка - быў адным з першых вельмі папулярныя інструменты, якія ўключаны рэгулярныя выразы ў 1960-х гадах. У 80-х гадах быў пабудаваны Perl - гэта мова праграмавання, які ўключае ў сябе рэгулярныя выразы вельмі заўважна. А потым зусім нядаўна мы мелі Perl сумяшчальныя рэгулярныя выразы пратаколаў у асноўным на іншых мовах, якія выкарыстоўваюць практычна тыя ж сінтаксісам. Вядома, найбольш важнай падзеяй стала ў 2008 годзе дзе быў першы Нацыянальны дзень рэгулярнага выразы, якім я веру, з чэрвеня 1, калі вы хочаце, каб адсвяткаваць гэта. Зноў жа, толькі крыху больш тэорыі тут. Такім чынам, існуе некалькі розных спосабаў пабудовы рэгулярных выразаў. Адзін з простых спосабаў з'яўляецца стварэнне выраз, якое вы збіраецеся працаваць на радок інтэрпрэтаваць - у асноўным пабудаваць невялікія міні-праграмы, якія прааналізуюць часткі радкі і паглядзець: "О, гэта спалучаецца з рэгулярным выразам ці не?" , А затым запусціць гэта. Так што калі ў вас ёсць вельмі невялікая рэгулярны выраз, гэта, верагодна, найбольш эфектыўны спосаб зрабіць гэта. І потым, калі вы - яшчэ адзін варыянт, каб захаваць рэканструкцыі выраз, як вы ідзяце, і што з'яўляецца магчымасць мадэляваць. І гэтыя першыя спробы рэгулярнай алгарытмы былі выразам адносна просты і адносна хутка, але не мелі вялікую гнуткасць. Так што ж рабіць нават некаторыя з рэчаў, якія мы будзем глядзець на Сёння мы павінны былі зрабіць больш складаныя рэгулярныя выразы рэалізацый, якія з'яўляюцца патэнцыйна значна больш павольна, так што нешта мець на ўвазе, Там таксама рэгулярныя выразы адмаўлення нападаў розных што выкарыстоўваюць патэнцыял гэтых новых рэалізацый рэгулярныя выразы, каб стаць вельмі складаным. І шмат у чым гэтак жа сэнсе, што мы бачылі ў нападаў на перапаўненне буфера, ў вас ёсць атакі, якія працуюць шляхам рэкурсіўных цыклаў, што перапаўнення ёмістасці памяці. І, дарэчы Regexen з'яўляецца адным з афіцыйных множнага ліку рэгулярных выразаў па аналогіі з валамі ў англа-саксонскага. Добра, так што бібліятэка Python, многія з вас асабіста ёсць Mac, так што вы можаце ажыццявіць гэта на экране. Рэгулярныя выразы убудаваны ў Python. І так Python прадусталяванай на кампутарах Mac, а таксама даступная ў Інтэрнэце па гэтай спасылцы. Так што калі вы глядзіце вы можаце прыпыніць і пераканайцеся, што ў вас ёсць Python як мы граем тут. Існуе кіраўніцтва онлайн, так што калі вы проста набярэце Python ў кампутар Вы ўбачыце, што версія з'яўляецца ў тэрмінале. Так што я пры ўмове спасылкі на кіраўніцтва для версіі 2 Python, а таксама шпаргалкі. Існуе версія, 3 з Python, але ваш Mac не абавязкова пастаўляюцца з прадусталяванай што. Так што не занадта адрозніваецца. Добра, так што некаторыя асновы выкарыстання рэгулярных выразаў у Python. Дык вось я выкарыстаў вельмі просты выраз, так што я зрабіў Python імпарт паўторна а затым узяў выніку re.search. І пошук займае 2 аргументаў. Першым з іх з'яўляецца рэгулярны выраз, а другі тэкст ці радок, якую вы хочаце прааналізаваць. А потым я раздрукаваў result.group. Так што гэтыя 2 асноўныя функцыі, якія мы сёння і ўбачым ў вывучэнні рэгулярных выразаў. Так што проста ламаюць гэтыя рэгулярныя выразы тут ч і затым \ W, а затым так м \ ж проста прымае любой літары ў алфавітным парадку там. Дык вось мы шукаем "H", а затым яшчэ літары ў алфавітным парадку м, а затым, дык вось, што будзе адпавядаць вяндлінай У "Абрагам Лінкальн і бутэрброды з вяндлінай". Гэта з'яўляецца вынікам гэтай групы. Іншая справа, што мы можам зрабіць, гэта выкарыстоўваць нашу перад радкамі тэксту ў Python. Таму я думаю, я буду ісці наперад і цягнуць, што тут. Python імпарт паўторна. І калі б я павінен быў зрабіць тое ж самае - скажам, тэкст, «Абрагам," давайце павелічэння - там мы ідзем. Тэкст: "Абрагам есць вяндліну". Добра, а затым вынік = re.search. І тады наша выраз можа быць гадзіну, а то і Я зраблю кропка м. Так што кропка проста бярэ любы знак, які не з'яўляецца новай лініяй уключаючы лікі, працэнт знакаў, нічога падобнага. А потым тэкст - бум - і тады result.group--так. Так што гэта проста, як рэалізаваць базавую функцыянальнасць тут. Калі б мы мелі тэксту кольца, - што вар'ят тэкст - уключаныя кажуць шмат зваротных касых чорт і струны унутры, так і рэчы, якія могуць выглядаць як кіраўнікі паслядоўнасці, то мы, верагодна, хочуць выкарыстоўваць сыравіну ўвод тэксту, каб пераканацца, што прынята. І гэта толькі так выглядае. Так што, калі мы шукалі для кожнага з іх там мы не павінны нічога знайсці. Але гэта, як вы будзе яго рэалізоўваць, проста перад радком рэгулярны выраз вы паклалі Літара R. Добра, так давайце працягваць ісці. Усё ў парадку - так што давайце паглядзім на пару паўтараюцца мадэлі тут. Такім чынам, адна рэч, якую вы хочаце зрабіць, гэта паўтарыць рэчы Як вы шукаеце па тэксце. Так што ж рабіць варта любы лік B - вы робіце AB *. А ёсць яшчэ шэраг іншых правілаў таксама. І вы можаце паглядзець усе гэтыя ўверх, я буду проста запусціць праз некаторыя з Найбольш часта выкарыстоўваюцца. Так AB + з'яўляецца ідуць любыя N больш 0 б. AB? гэта варта 0 або 1 б. AB {N} з'яўляецца затым н У, а затым гэтак далей. Калі ў вас ёсць 2 лікі ў фігурных дужках вы паказваеце дыяпазон , Які можа быць магчыма супадаюць. Так што мы будзем больш глядзець на пару паўтараюцца мадэлі ў хвіліну. Так што 2 рэчы, каб мець на ўвазе пры выкарыстанні гэтых інструментаў шаблоне тут. Так што сказаць, што мы хочам паглядзець на ТМ "Абрагам Лінкальн робіць бутэрброды з вяндлінай". Таму я змяніў імя Абрагама Лінкольна Абрагаму. І цяпер мы шукаем тое, што вяртаюцца гэтай функцыяй пошуку, і ён вяртае толькі вяндліну ў гэтым выпадку. І ён робіць гэта таму, што пошукавыя проста, натуральна, займае самую левую чэргі. І ўсе рэгулярныя выразы, калі не паказана інакш будзе гэтага рабіць. Калі б мы хацелі, каб знайсці ўсё, што ёсць функцыі для гэтага - знайсці ўсё. Так што можа проста глядзець, як усё = re.findall ('h.m', тэкст) а затым all.group (). Усе вырабляе як вяндліна і вяндліну, і ў гэтым выпадку абодва з радкоў у кожнай Абрагама вяндліны. Так што гэта яшчэ адзін варыянт. Вялікі. Акрамя таго, неабходна мець на ўвазе, што рэгулярныя выразы ўзяць найбольшую інтуітыўна. Давайце паглядзім на гэты прыклад. Мы зрабілі гэта левае што шукаць, а затым я паспрабаваў большага пошуку дапамогай аператара Клін зоркі. Так што для "Абрагам Лінкальн робіць бутэрброды з вяндлінай", і я толькі што вярнуўся м у якасці выніку. Прычынай таму было памылкай, што я мог узяць любую колькасць г таму, што я не ўдакладніў, што-небудзь, каб прайсці паміж ч і т. Адзіны прыклад, што там былі м - адзіныя прыклады там з м у ім і ў любой колькасці г былі проста радок м. Тады я паспрабаваў яго зноў, я сказаў: "Добра, давайце, рэальнае максімальную групу тут." І тады я зрабіў гадзіну. * М, так што проста вяртае любую колькасць знакаў паміж ч і т. І калі вы толькі пачынаеце, і думаў: "О, добра, добра гэта будзе зразумейце мяне вяндліна, "на самай справе прымае ўсе, ад г Абрагам Лінкальн аж да канца вяндліны. Гэта прагны, бачыць г - усё гэта іншы тэкст - м, і гэта тое, што ён прымае цалі Гэта асабліва абуральнымі - гэта функцыя, мы можам таксама паказаць для яго не быць прагным выкарыстання іншых функцый. Але гэта тое, што мы павінны мець на ўвазе, асабліва пры поглядзе на HTML тэкст, які з'яўляецца адной з прычын, што Рэгулярныя выразы з'яўляюцца цяжкімі для HTML. Таму што, калі ў вас ёсць адкрытыя тэгі HTML, а затым шмат матэрыялу ў сярэдзіне , А затым некаторыя іншыя HTML тэгі зачыненыя значна пазней у праграме, вы толькі што зьелі шмат вашага HTML кода магчыма па памылцы. Усё ў парадку - так яшчэ спецыяльныя сімвалы, як і многія іншыя мовы, мы пазбягаем выкарыстання касой рысы. Так што мы можам выкарыстоўваць кропку, каб задаць любы знак, за выключэннем новага радка. Мы можам выкарыстоўваць ўцёкі W пазначыць любыя літары алфавіту. І па аналогіі ўцёкі D для любога цэлага - колькасны характар. Мы можам паказаць - мы можам выкарыстоўваць дужкі, каб паказаць звязаных выразаў. Так што гэта будзе прыняць A, B, або C. І мы можам таксама пазначыць або варыянты А ці Б. Напрыклад - калі мы шукалі некалькі магчымасцяў У дужках мы маглі б выкарыстоўваць у якасці аператара або ў - так што давайце вернемся да гэтага прыклад. А цяпер давайце - давайце вернемся да гэтага прыкладу тут, а затым прыняць AE - так што гэта павінна вярнуцца - я думаю, гэта яшчэ Абрагаму. Так гэта - калі мы робім усё - малайцы. Так давайце абнавіць тэкст тут. "Абрагам есць вяндліну у той час як яго падшываць -. Складалі ў той час як" Вялікі. Ўсё. Вялікі. Цяпер мы атрымліваем Вяндліна, вяндліна, і падол. У той час як Хемминг - у той час напявала яму - у той час напяваў падол яго. Вялікі. Тое ж самае. Цяпер усё вяртаецца яшчэ толькі вяндліна, вяндліна, і падол, не падымаючы на ​​шум або яго. Вялікі - так што, калі мы хацелі паглядзець, што альбо - так што мы маглі б зрабіць яго ці - мы вернемся да гэтага. Добра - так - усё ў парадку - у пазіцыях вы таксама можаце выкарыстоўваць карэтку або знак даляра паказаць, што вы шукаеце што-то ў пачатку ці ў канцы радка. Ці ў пачатку ці ў канцы слова. Гэта адзін са спосабаў, каб выкарыстоўваць гэта. Добра - так што давайце пагуляйце з трохі вялікім блокам тэксту. Скажам, гэты радок тут - гэтая заява тут. Сіла рэгулярных выразаў, што яны могуць задаць шаблоны не толькі фіксаваных сымбаляў. Зробім - назавем гэтага блока. Тады мы прачыталі ўсё, што цаля А далей ужо - зробім усё =; Так што некаторыя рэчы, якія мы маглі шукаць тут выгадна? Можна звярнуць увагу на выраз вуха. Не вельмі цікава. Як наконт гэтага? Мы ўбачым, што адбудзецца. Я даў яму праблемы. Такім чынам, любое колькасць рэчаў, перш чым паўторна і ўсё. Так што павінны вярнуцца ўсе, ад пачатку да ўсіх Re магчыма пару разоў. А потым тут у нас ёсць моц рэгулярных выразаў з'яўляецца тое, што яны Можна паказаць шаблёны ня толькі знакі тут. Такім чынам, усё, аж да канчатковага паўторна, ён пачаў з самага левага і быў прагным. Давайце паглядзім - што яшчэ мы маглі б шукаць. Я думаю, адна справа, калі б вы былі зацікаўленыя ў пошуку займеннікі ён і яна, Вы можаце праверыць з роўным 0 або 1 і выраз, якое ён, і што, верагодна, не збіраецца вяртацца - О, я думаю, гэта ён вярнуўся, таму што мы глядзім на ўладу, у той дзень, тут. Паспрабуем удакладніўшы, што гэта павінна прыйсці ў пачатку нешта. Давайце паглядзім, калі гэта падае. Так што мы можам зрабіць, тлушч, таму мы нічога не атрымліваем, таму што яна і ён не сустракаюцца ў гэтай фразе. Вялікі. Добра - Такім чынам, вернемся да котцы тут. Так складанымі ўзорамі шкодзіць мозгу. Вось чаму мы выкарыстоўваем рэгулярныя выразы, каб пазбегнуць гэтых праблем. Такім чынам, вось некалькі іншых карысных рэжымаў вы можаце пагуляць з. Мы глядзелі на пошук сёння, але вы таксама можаце выкарыстоўваць матч, Спліт, FindAll і групы. Так іншых цікавых рэчаў, якія вы можаце зрабіць з дапамогай рэгулярных выразаў, акрамя ўсяго шукае мадэляў прымае шаблон і правядзенне ўсіх матчаў - сваіх зменных, - а затым, выкарыстоўваючы гэтыя ў кодзе пазней. Гэта можа быць вельмі карысным. Іншыя рэчы, можна лічыць. Такім чынам, мы можам падлічыць колькасць асобнікаў шаблон рэгулярнага выразы, і гэта тое, што мы можам выкарыстоўваць для груп. І іншых рэжымаў, а таксама магчымыя. Так што я проста хачу пагаварыць трохі больш аб іншых спосабах можна выкарыстоўваць рэгулярныя выразы. Так што яшчэ з'яўляецца перадавым дадаткам невыразнага адпаведнасці. Так што калі вы шукаеце тэкст для выражэння, Юлій Цэзар, і вы бачыце, альбо Гай Юлій Цэзар або імя Юлій Цэзар на іншых мовах, Вам таксама неабходна надзяліць некаторымі вага гэтых каштоўнасцяў. І калі гэта досыць блізка - калі ён перасякае пэўны парог - то вы хочаце, , Каб мець магчымасць прыняць Юлія Цэзара. Такім чынам, існуе некалькі розных рэалізацый, што ў некалькіх іншых мовах. Вось некаторыя іншыя інструменты, Regex Pal - зручнае невялікае прыкладанне онлайн праверыць, калі ваш рэгулярныя выразы складаюцца правільна. Ёсць таксама аўтаномныя сродкі, якія можна запусціць з працоўнага стала Ультра як піка, і гэтак жа як толькі кніжак па кулінарыі. Так што, калі вы робіце праект, які ўключае ў сябе тоны рэгулярных выразаў гэта, мабыць, месца, каб пайсці за рамкі сённяшняга дня. А потым проста каб даць вам адчуванне таго, як агульнае яно ёсць GREP ў Unix, Perl мае ўбудаваны, і З ёсць PCRE для C. А потым усе гэтыя іншыя мовы таксама маюць рэгулярныя выразы пакеты , Якія працуюць практычна з тымі ж сінтаксіс мы атрымалі густ сёння. PHP, Java, Ruby, і гэтак далей. Пошук кода Google на самай справе варта згадаць, гэта адна з адносна няшмат прыкладанняў, якія там дазваляе грамадскасці на доступ да сваю базу дадзеных з дапамогай рэгулярных выразаў. Так што, калі вы паглядзіце на код пошуку Google вы можаце знайсці код Калі вы шукаеце прыклад таго, як функцыя можа быць выкарыстаная, Вы можаце выкарыстоўваць рэгулярныя выразы, каб знайсці, што выкарыстоўваная функцыя ў самыя розныя выпадкі. Вы можаце зірнуць на FWRITE, а затым вы можаце паглядзець на сцяг чытання або запісы Калі вы хацелі прыклад FWRITE выкарыстоўваюцца ў гэтым выпадку. Так тое ж самае там, і тут некаторыя спасылкі. Гэта будзе даступная ў Інтэрнэце, так што наперад, калі збіраецеся Вы хочаце паглядзець на Python, GREP, Perl - вы проста хочаце атрымаць натхненне або калі вы хочаце выглядаць больш у тэорыі вось некаторыя добрай стартавай месцах. Вялікі дзякуй. [CS50.TV]