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