[Powered by Google Translate] [Семинар: модел за съвпадение с регулярни изрази] [John Mussman-Harvard University] [Това е CS50.-CS50.TV] Добре. Е, добре дошли всички. Това е CS50 2012. Моето име е Джон, и аз ще се говори днес за регулярни изрази. Регулярни изрази е основно средство, но също така понякога се използва в код активно същество съвпадат модели и връв. Така че тук е един уеб комикс от XKCD. В този комикс има мистерии убийство, където убиецът има последвано някой на почивка, и главните герои трябва да търси чрез 200 мегабайта имейли търсещи адрес. И те са на път да се откажа, когато някой, който знае регулярни изрази - вероятно супергерой - спуска надолу и пише някакъв код и решава мистерии убийство. Така се предполага, че ще бъде нещо, което ще бъде предоставено правомощието да направи след този семинар. Ние просто ще предоставят кратко въведение към езика и ще ви даде достатъчно средства, за да отиде след повече ресурси по своему. Така регулярни изрази изглежда основно като този. Това е регулярен израз в Ruby. Не е страшно различно на различни езици. Ние имаме само върху наклонени черти, за да започне и марки на регулярен израз в Ruby. И това е регулярен израз, за ​​да търсите в модел имейл адрес. Така ние виждаме в първия бит търси всеки буквено-цифров знак. Това е така, защото имейл адресите, често трябва да се започне с буква от азбуката. И тогава всеки специален знак, последван от символа @. И тогава едно и също нещо за името на домейна. И тогава между два и четири знака да се търси. COM,. Мрежа, и така нататък. Така че това е още един пример за регулярен израз. Така че регулярните изрази са протоколи за намиране на ритъм в текста. Те правят сравнения, селекции, и замяна. Така трети пример е намирането на всички телефонни номера, завършващи на 54 в директория. Така че, преди разкъсва Дейвид до директорията CS50 бихме могли да търсят модел, където имаме скоби след три номера след края скоби, 3 допълнителни номера, тире, две числа, а след това 54. И това ще бъде по същество как да излезе с регулярен израз да търсите за това. Така че има - ние сме направили някои неща в CS50, че са малко като регулярни изрази, така че - например - в dictionary.C файл за правописа набор проверка проблем може да сте използвали fscanf да се чете с една дума от речника. И можете да видите процентното 45s търси низ от 45 символа. Така че това е нещо като елементарен регулярен израз. И вие можете да имате 45 символа, които отговарят на сметката там и да изберат тези, нагоре. И след втория пример в най-скорошния проблем уеб програмиране разположен в дистрибуция код за PHP всъщност имат един прост регулярен израз. А това е само просто гледам да проверите дали уеб страницата, която се предава в пасва с вход или изход се регистрирай. PHP. И след това се връщат вярно или невярно, че въз основа на редовен съвпадение изразяване. Така че, когато използвате регулярен израз? Защо сте тук днес? Така че не искате да използвате регулярен израз, когато има нещо, което върши работа за вас, още по-лесно. Така че, XML и HTML са всъщност доста труден да пише регулярни изрази за както ще видим след малко. Така че има специални парсъри за тези езици. Вие също трябва да се оправи с компромиси и точността често. Ако се опитвате - така видяхме регулярен израз за имейл адрес, но казват, че искаш конкретна имейл адрес и постепенно регулярен израз може да стане по-сложна, тъй като стана по-точен. Така че това ще бъде един компромис. Трябва да сте сигурни, че сте добре направи с регулярен израз. Ако знаете какво точно търсите може да има повече смисъл да се сложи във времето и да напише по-ефективно анализатор. И най-накрая има исторически проблем с редовността на изразяване и на различни езици. Регулярни изрази всъщност са много по-мощни, отколкото регулярни изрази на казват в официално смисъл. Така че аз не искам да отиват твърде далеч в официалната теория, но повечето езици, които ние код в действителност не са редовни. И това е причината регулярни изрази понякога не се считат всички, които сигурно. Така че основно има йерархия на Чомски за езика, и регулярни изрази се изгради използване съюз, конкатенация, и звездата Kleene операция, която ще видим в рамките на няколко минути. Ако се интересувате от теория има доста много неща се случват там под капака. Така кратка история - само за контекста тук - редовни набори изскочи през 1950-те, а след това имахме прости редактори, че включени регулярни изрази - просто търсите струни. Grep - което е командния ред инструмент - беше един от първите, много популярни инструменти, включени регулярни изрази през 1960. През 80-те, Perl е построен - е език за програмиране, че включва регулярни изрази много видно място. И тогава по-скоро ние сме имали Perl съвместими регулярен израз протоколи основно на други езици, които използват голяма част от същия синтаксис. Разбира се, най-важното събитие беше през 2008 г. където имаше първата Национална Редовен Ден изразяване, която според мен е 01 юни, ако искате да го отпразнуваме. Отново, само малко по теория тук. Така че има няколко различни начина на конструиране на регулярни изрази. Един прост начин е да се изгради на израза, който ще тече от низ тълкува - основно изграждане на малко мини-програма, която ще анализира парчета низ и да видим, "О, това се поберат на регулярен израз или не?" И след това да изпълните това. Така че, ако имате много малък регулярен израз, това е може би най-ефикасният начин да го направя. И тогава, ако - друг вариант е да се запази реконструкция на изразяване, както и да отидеш, и това е възможността да симулира. И тези ранни опити за редовни алгоритми експресия са сравнително прости и сравнително бързо, но не разполагате с много гъвкавост. Така че да се направи дори и някои от нещата, които ние ще разгледаме Днес трябваше да направя по-сложни регулярен израз реализации, които са потенциално много по-бавно, така че това е нещо, което да се има предвид, Освен това има и редовен отказ изразяване на атака разнообразие че се използва потенциалът на тези нови реализации на регулярни изрази, за да стана много сложна. И по същия смисъл, че ние видяхме в атаки за препълване на буфера, имате атаки, които работят като прави чести повторения, че превишаване на капацитета на паметта. И между другото Regexen е един от официалните множествено число на регулярен израз по аналогия с волове в англосаксонския. Добре, така че библиотеката Python много от вас тук, в лицето имат Mac-ове, така че всъщност можете да дръпнете този на екрана. Регулярните изрази са вградени в Python. И така, Python е предварително заредено на Mac-ове и също така на разположение онлайн в тази връзка. Така че, ако гледате можете да направите пауза и се уверете, че имате Python като играем тук. Има ръководство онлайн, така че ако просто напишете Python в компютъра си ще видите, че версията идва в терминала. Така че при условие връзка към потребителя за версия 2 на Python, както и мамят лист. Има версия 3 на Python, но си Mac не означава непременно идват с предварително инсталирана това. Така че не са ужасно различни. Добре, така че някои от принципите на използване на регулярни изрази в Python. Така че тук аз използвах един много прост израз, така че направих Python внос повторно и след това взе резултат от re.search. И търсенето отнема 2 аргументи. Първият е регулярен израз, а вторият е текста или низ искате да анализирате. И тогава аз отпечатани на result.group. Така че това са две основни функции, ние ще виждаме днес да научите за регулярни изрази. Така че просто се счупи този регулярен израз тук часа и след това \ w и след това m така \ w просто приема всяка буква от азбуката там. Така че тук ние търсим за "з" и после още една буква, и след това m, така че тук ще съответстват и шунка в "Ейбрахам Линкълн и сандвичи с шунка." Това е в резултат на тази група. Друго нещо, което можем да направим, е да използвате нашите преди текстови низове в Питон. Така че предполагам, аз ще отида напред и да дръпнеш тук. Python внос повторно. И ако трябва да направи същото нещо - да кажем, текст, "Авраам," нека да я увеличите - ето. Текстът е: "Авраам яде шунка." Добре, а след това доведе = re.search. И тогава нашият израз може да бъде ч, а след това аз ще направя точка m. Така че точка просто отнема всеки знак, който не е нов ред, включително техния брой, процентни признаци, нещо подобно. И тогава текст - бум - и след това result.group--да. Така че това е просто начина на прилагане на основните функции тук. Ако имахме текст пръстен, който - онзи луд текст - включени кажа много наклонени черти и струни вътре и неща, които може да изглеждат като ескейп последователности, тогава може би искате да използвате суров въвеждане на текст да се уверите, че е приет. И това само изглежда така. Така че, ако търсим всеки един от тях там не трябва да намеря нищо. Но това е как ще го приложи, точно преди низ от регулярния израз ви постави писмото R. Добре, нека да продължаваме. Добре - така че нека разгледаме няколко повтарящи се модели тук. Така че едно нещо, което искате да направите, е да повторя неща като търсите чрез текст. Така че да се направи след всеки брой на б - правите AB *. А има и редица други правила също. И вие можете да погледнете всички тези действия; просто ще премине през някои от най- Най-често използваните. Така AB + е последвано от нито един N-голямо от 0 на б. аб? е последвано от 0 или 1 б. AB {N} е последвано от N на В, и след това така нататък. Ако имате два номера в фигурни скоби се определя обхват която може да бъде евентуално съчетани. Така че ние ще изглежда по най-няколко повтарящи се модели в една минута. Така че две неща трябва да имате предвид, когато използвате тези модел за съвпадение инструменти тук. Да предположим, че искаме да погледнем на ЗМ на "Abraham Lincoln прави сандвичи с шунка." Така че промяна името на Ейбрахам Линкълн на Авраам. И сега ние търсим това, което се връща от тази функция за търсене, и да го връща само шунка в този случай. И го прави това, защото търсенето просто естествено е на най-лявата опашката. И всички регулярни изрази, освен ако не сте задали друго, ще го направя. Ако искахме да се намери всичко там е функция за това - да намерите всичко. Така, че може просто да изглежда като всички = re.findall ("h.m", текст) и след това all.group (). All произвежда шунка и шунка, а в този случай и двете струни в Abraham всяка шунка. Така че това е друг вариант. Great. Другото нещо, което трябва да имате предвид е, че регулярните изрази вземе най-голямата интуитивно. Нека разгледаме този пример. Ние направихме, че най-лявата търсене тук, а след това се опитах по-голямо търсене използвате Kleene оператор звезда. Така че за "Abraham Lincoln прави сандвичи с шунка," и аз само се върна т като резултат. Причината за тази грешка беше, че е могла да вземе произволен брой Н е, защото аз не уточни нищо да отида в между Н и m. Единственият пример, че там имаше m - единствените примери там с m в него и произволен брой ч. Това е само низ т. Тогава аз се опитах отново; аз казах: "Добре, нека да получите действителната големина група тук." И след това, което направих часа. * M, така че просто се връща произволен брой знаци между Н и m. И ако са само началото и мисля, "О, добре, добре това ще да ме бута ", това всъщност се всичко от час в Abraham Lincoln по целия път до края на шунка. Той е алчен, той вижда ч - всичко това друг текст - m, и това е, какво е необходимо инча Това е особено нечуваното - това е функция, ние също може да зададени за не бъдете алчни Използване на други функции. Но това е нещо, което трябва да се има предвид особено при разглеждане на HTML текст, който е една от причините, че регулярни изрази са трудни за HTML. Защото, ако имате HTML отворен етикет и след това много неща в средата и след това друг HTML затворен етикет много по-късно в програмата, току-що сте изяде много HTML кода си вероятно по погрешка. Всички права - толкова повече специални символи, подобно на много други езици, ние избяга с помощта на наклонена черта. Така че ние можем да използваме точка, за да се използва всеки знак с изключение на нов ред. Ние можем да използваме бягство w да се уточни всеки буквен знак. И от г аналогия бягство за всяко цяло число - цифрово-буквен знак. Ние можем да определят - можем да използваме скоби да се уточни, свързани с изразяване. Така че това ще приеме, Б или В. И ние също така да зададете или възможностите за или б. Например - ако търсим множество възможности в скоби, можем да използваме или оператор, както в - така че нека да се върнем към този пример тук. А сега нека вземем - да се върнем към този пример тук, а след това вземат ад - така че това трябва да се върне - Предполагам, че това все още е Авраам. Така че това - ако правим всичко - страхотно. Така че нека да актуализира текста тук. "Авраам яде шунка, докато покашляне му -. Докато Хеминг" Great. All. Great. Сега ние се шунка, шунка, и подгъва. Докато Хеминг - докато тананикам с него - докато тананикам да го подгъва. Great. Същото нещо. Сега всичко се връща все още само шунка, шунка, и подгъва без вземане на бучене или на него. Great - и какво от това, ако искаме да разгледаме, че или - за да можем да направим освен това него - ще се върнем към това. Добре - така - добре - в позиции, можете да използвате и карета или знака за долар да се уточни, че търсите нещо в началото или в края на низ. Или началото или края на думата. Това е един от начините да го използват. Добре - така че нека си поиграете с малко по-голям блок от текст. Нека да кажем, този ред тук - това твърдение тук. Силата на регулярен израз е, че те могат да се определят моделите не само определени знаци. Нека направим - нека наречем това блок. След това ние ще прочетете всичко това инча И след това да има - нека направим всичко =, така че това, което някои неща, които бихме могли да търсят тук изгодно? Бихме могли да се огледа за изразяване ухо. Не е много интересно. Какво ще кажете за това? Ще видим какво ще стане. Дадох я проблем. Така че са много неща, преди отново и всичко останало. Така че трябва да се върне всичко от началото до всички повторно може би няколко пъти. И след това тук ние имаме силата на регулярните изрази е, че те да зададете модели не само на героите тук са. Така че по целия път до крайната повторно, тя започва с най-лявата и беше алчен. Нека да видим - какво друго може да очакваме. Предполагам, че едно нещо, ако имате интерес да търсят местоимения тя и той, можете да проверите за S е равна на 0 или 1 и изразяването му, и че най-вероятно няма да се върне - О, предполагам, че той се върна, защото там ще се търсят в сила, този ден, тук са. Нека се опитаме уточни, че това трябва да излезе в началото на нещо. Нека да видим дали това отпада. Така че можем да направим, мазнини, и там не се получи нищо, защото тя и той не се срещат в тази фраза. Great. Добре - така че обратно на котка тук. Така сложни модели се наранява мозъка. Така че това е защо ние използваме регулярни изрази, за да се избегнат тези проблеми. Така че тук са някои други полезни видове можете да си поиграете с. Разгледахме търсене днес, но можете да използвате и мач, Сплит, findall и групи. Така други готини неща, които можете да направите с регулярни изрази освен просто търси модели е като модел и държи всички мачове - неговите променливи - и след това с помощта на тези в кода си по-късно. Това може да бъде много полезно. Други неща, които могат да бъдат преброяване. Така че можем да разчитаме на брой копия на един постоянен израз, и това е, което можем да използваме за групи. И другите видове, както също са възможни. Така че аз просто искам да поговорим малко повече за други начини, които можете да използвате регулярни изрази. Така един по-напреднал заявление е в размита съвпадение. Така че, ако търсите за текст за изразяване, Юлий Цезар, и ще се видим или Гай Юлий Цезар или името Юлий Цезар и на други езици, тогава може да искате да зададете някои тегло до тези стойности. И ако това е достатъчно близо - ако пресича определен праг - след това искате да бъде в състояние да приеме Юлий Цезар. Така че има няколко различни приложения за това в рамките на няколко други езици, както добре. Ето и някои други инструменти, Regex Пал - един удобен малък ап онлайн, за да Проверете дали регулярните изрази са съставени правилно. Има и самостоятелни инструменти, които могат да работят от компютъра си като Ultra Pico, и както само готварски книги. Така че, ако сте прави проект, който включва един тон на регулярни изрази това е може би мястото да отида извън обхвата на днес. И след това просто да ви даде усещане за това как е честотата му има Впиши в Unix, Perl има вградена и C има PCRE за C. И след всички тези други езици също имат редовни пакети експресия , които работят с по същество същата синтаксиса имаме вкус на днешния ден. PHP, Java, Ruby, и така нататък. Google Code Search е действително си струва да споменем, че е един от най- сравнително малко приложения там, че дава възможност на гражданите да имат достъп своята база данни с помощта на регулярни изрази. Така че, ако се вгледате в Google Code търсене можете да намерите код ако търсите пример за това как една функция може да се използва, можете да използвате регулярен израз, за ​​да намерите тази функция се използва в най-различни случаи. Можете да потърсите неуспешно, и след това можете да търсите за флага на запис или четене ако искаш пример за неуспешно се използва в този случай. Така че едно и също нещо там, и тук са някои препратки. Това ще бъде на разположение онлайн, както и, така че ще напред, ако искате да разгледате Python, Впиши, Perl - просто искате да получите някои вдъхновение или ако искате да изглежда по най-теорията тук са някои добри скача места. Благодаря Ви много. [CS50.TV]