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