Добрый день, в этом видео мы закончим изучать синтаксис регулярных выражений, разберем замену с помощью регулярных выражений и их компиляцию, узнаем что делать с помощью регулярных выражений, а что лучше не делать и подведем итоги. Давайте рассмотрим специальные символьные классы. В прошлом видео мы рассматривали обычные символьные классы, а специальные символьные классы, это всего лишь сокращение для наиболее часто используемых символьных классов, например, \w обозначает букву, цифру и знак подчеркивания. В питоне 3 под буквами и цифрами подразумевается также символ национального алфавита, не только ASCII. Если мы хотим, чтобы буквы были только буквой латинского алфавита, то есть ASCII, мы должны указать специальный флаг re.ASCII и тогда под \w будут попадать только латинские буквы и цифры. /W, это обратный символьный класс, который означает, что в этом месте может стоять все что угодно, кроме букв, цифр и знака подчеркивания. \s обозначает пробел, причем не только пробел как таковой, но и другие пробельные символы, такие как тобуляция и перенос строки. \S обозначает не пробел, а \b обозначает границу слова, то есть границу между символом, между буквой и не буквой, причем сама эта граница занимает ноль символов, то есть не является символом. \B, это позиция внутри слова. Крышка и доллар, мы упоминали о нем в предыдущем видео, это начало и конец строки. Причем если не указан ключ мултилайн, то это начало и конец строки всего текста, а если указан дополнительный флаг мультилайн, то это начало и конец каждой строке, если текст многострочный. Давайте попробуем немного практики. У нас есть список никнеймов, которые мы хотим проверить корректные они или некорректные. Мы считаем, что в никнейме у нас может быть только буквы, цифры и знак подчеркивания. Давайте попробуем написать регулярное выражение. Смотрите, в нашей программе мы используем метод re-compile, который позволяет один раз компилировать регулярное выражение и потом несколько раз его использовать. Методы у скомпилированного регулярного выражения, ровно такие же, как у модуля ре, только не надо передавать первым параметром само регулярное выражение, потому что оно задается именно при компиляции, также вторым параметром [inaudible] у re-compile могут быть флаги, это удобно использовать если регулярное выражение встречается несколько раз в программе или используется внутри цикла, чтобы каждый раз оно не компилировалось заново внутри больших вычислений, внутри длительных вычислений не повторялся этот код. Давайте переберем все ники, в нашем списке никнеймов и проверим, является ли никнейм валидным или нет. Для этого мы будем писать valid, если регулярное выражение нашло полностью соответствие в нашем нике и in valid, если нет. Давайте попробуем. Удивительно все ники у нас валидны. Почему так получилось? Ведь на самом деле в Алёне есть буква ё, которое не соответствуют латинскими буквам, а в Иван Ивановиче вообще есть пробел. Дело в том, что мы написали match, который хотя и ищет соответствия сначала строки, в отличие от search, который ищет полностью, но никто не говорит, что это соответствие должно идти до конца строки, поэтому супер хаксер нашелся целиком, в Алёне наш match нашел первые две буквы А Л, которые попали под регулярный уровень, и это было достаточно, он уже вернул истину. Иван Иванович точно также. Что же нам делать?Конечно же мы можем с легкостью изменить это регулярное выражение просто добавив крышку и доллар. Теперь оно будет означать, что начиная с начала строки до самого ее конца идут буквы, цифры и подчеркивания. Попробуем, что у нас получилось. Теперь Иван Иванович стал не валидным, но Алёна по прежнему осталась валидной, потому что под \w попадают и символ национального алфавита. Если мы хотим сделать, чтобы под \w попадали только английские буквы, мы должны добавить флаг re.ASCII. После этого валидным у нас остается ник только суперхаксер, который полностью удовлетворяет нашим требованиям к никам. Давайте попробуем еще немножко поиграть с регулярными выражениями, давайте найдем в строке, имеющееся у нас, все женские имена, но найти по настоящему все женские имена мы не сможем, давайте будем искать строки, которые начинаются с большой буквы, а заканчивается на -на. Многие женские имена заканчиваются на -на. Давайте попробуем. Сначала у нас идет большая буква А, это символьный класс от А до Я, потом идет любые буквы, цифры, ну в женских именах не может быть цифр, подчеркиваний, поэтому мы с некоторым допущением считаем, что подойдет наш \w и заканчивается на две маленьких буквы н и а. Давайте посмотрим, что у нас найдется в данном случае. Нашлась Анна, нашлась Лена, нашлась Яна и нашелся -ильнар, потому что мы же не говорим в нашем регулярном выражении, что это должно быть последней буквы слова, у нас просто после каких-то букв идет на, и действительно, нашелся -ильнар, который нам не нужен. Что нужно сделать, чтобы этого не было? Мы можем добавить границу слова в начало и в конец регулярного выражения, тогда это будет означать, что мы действительно ищем слово, которое начинается с большой буквы и заканчивается на на. Давайте попробуем. Ильнар у нас ушел, какие еще есть минус у этого регулярного выражения. Допустим к нам пришли не только ЯНА, но и ПОЛИНА, которое написано большими буквами. Полина, конечно же, у нас не нашлась, потому что мы ищем слова оканчивающиеся на маленькие буквы. Давайте исправим это. Попробуем написать группу, в которую входит как -на маленькое так и -на большое. Что у нас вернулось? на, на на, НА, потому что файндолл, если находит группу внутри строки, возвращает уже не все соответствие регулярного выражения, а только то, что попало в группу. Это тоже можно исправить, используя специальный синтаксис знак вопроса и двоеточие. Если внутри скобок поставить знак вопроса и двоеточие, то это будет означать, что то, что в них находится, группируется, но не запоминается, таким образом мы сможем вернуть все, что нам требуется. Давайте перейдем к более сложным случаям. Допустим у нас есть строка, как защитить металл от процесса коррозии. В этих словах встречаются двойные буквы, то есть две буквы одинаковых идущих подряд. Как же это найти? Для этого мы можем использовать обратные ссылки. Напишем такое регулярное выражение. В скобках \w, которое означает любую букву или цифру, а за ней \1, то есть мы будем ссылаться на то, что попало внутри скобок. Скобка образует группу с номером один, а /1 ссылается на первую группу. Таким образом под это регулярное выражение попадет любая двойная буква или цифра или знак подчернкивания. Давайте проверим. Мы нашли буквы л, р, с и и. Давайте попробуем теперь в этой строке заменить все буквы а на знаки вопроса. Для этого мы используем новый метод re.sub, который принимает регулярные выражения, текст для замены и текст, в котором мы заменяем и возвращает уже замененный текст. Давайте теперь совместим эти два варианта и попробуем не просто найти все двойные буквы, а заменить их на заглавную версию самих себя. Для этого мы можем передать в re.sub функцию, внутри которой мы будем обращаться к найденному тексту и переводить его в верхний регистр. Делается это довольно просто. Смотрите, у нас получилась строка как защитить металл от процесса коррозии, мы нашли все двойные буквы и выделили их большим регистром, верхним регистром. А что нам делать, если мы хотим заменить найти все слова, в которых содержатся двойные буквы, и выделить их уже целиком, не просто двойные буквы, а все. Для этого мы можем использовать замену на содержимое группы. Давайте немножечко исправим наше регулярное выражение предыдущее и добавим еще одну группу. Смотрите, что такое слово с двойными буквами, это слово, которое начинается с границы слова, потом может идти сколько-то любое число букв, до тех пор пока не встретятся двойная, потом идёт эта самая буква, потом она ещё раз повторяется и после неё идёт ещё сколько-то букв и затем опять граница слово. Вот так можно найти слова с двойными буквами в любом его месте. Поскольку нам надо заменить не все, не только двойные буквы но и всё слово целиком обозначить, мы его тоже заключаем в группу. Получается вот такое регулярное выражение - \b открывается группа для всего слова, произвольное число букв, потом какая-то буква, которую мы запоминаем, потом она же, потом опять какое-то произвольное число букв и опять граница слово. В метод sub мы можем в качестве строки для замены передать содержимое группы, которую мы захватили ранее, в частности группа номер один, это у нас все слово, ее мы окружаем в квадратные скобки, в строке замена они не имеют никакого специального значения, это просто квадратные скобки. Давайте посмотрим, что у нас получилось. Смотрите, мы выделили все слова с двойными буквами в квадратные скобки. На этом мы заканчиваем разбор регулярных выражений. Хотелось бы подвести какие-то итоги. Мы узнали базовые возможности регулярных выражений, это далеко не все их возможности, но их вполне достаточно для большинства применений. Если вы хотите узнать о регулярных выражениях больше, то вам следует изучить дополнительные материалы к этому уроку и документацию питона. Также я хотел бы упомянуть цитату, которую озвучил Джеффри Фридол, автор книги мастер [inaudible] , если у вас есть проблемы и вы решили использовать регулярные выражения, у вас уже две проблемы. Это конечно шутка, но в каждой шутке есть доля правды. В следующем видео мы начнём пaрсить сайты с Beautiful Soup.