На этом шаге мы рассмотрим алгоритм решения этой задачи.
Данный однострочник демонстрирует, как решить одну из тех маленьких, но требующих много времени задач, с которыми так часто сталкиваются веб-разработчики.
Допустим, вы ведете блог по программированию и только что перевели свой сайт с небезопасного протокола http на (более) безопасный
протокол https. Однако ссылки в ваших старых статьях по-прежнему указывают на старые URL. Как же найти все эти ссылки на старые URL?
На предыдущем шаге вы научились с помощью нотации с квадратными скобками задавать произвольные диапазоны символов. Например, регулярному выражению
[0-9] соответствует любое число из одной цифры от 0 до 9. Однако потенциальные возможности нотации с квадратными скобками намного шире. Можно точно
задавать символы, на соответствие (или несоответствие) которым необходимо проверить, путем указания в квадратных скобках произвольных сочетаний символов.
Например, регулярному выражению [0-3a-c]+ соответствуют строки символов '01110' и '01c22a', но не строка '443' или '00cd'.
Можно также задавать фиксированный набор символов, которые не должны содержаться в найденном шаблоне, с помощью символа ^: регулярному выражению
[^0-3а-с]+ соответствуют строковые значения '4444d' и 'Python' и не соответствуют строки символов '001' и '01c22a'.
Входные данные здесь представляют собой многострочное строковое значение, в котором нам нужно найти все вхождения допустимых URL, начинающихся с префикса http://. Однако рассматривать недопустимые URL без домена верхнего уровня (в найденном URL должна содержаться хотя бы одна .) не следует. Взгляните на пример 5.5.
## Зависимости import re ## Данные article = ''' The algorithm has important practical applications http://blog.finxter.com/applications/ in many basic data structures such as sets, trees, dictionaries, bags, bag trees, bag dictionaries, hash sets, https://blog.finxter.com/sets-in-python/ hash tables, maps, and arrays. http://blog.finxter.com/ http://not-a-valid-url http:/bla.ba.com http://bo.bo.bo.bo.bo.bo/ http://bo.bo.bo.bo.bo.bo/333483--33343-/ ''' ## Однострочник stale_links = re.findall('http://[a-z0-9_\-.]+\.[a-z0-9_\-/]+', article) ## Результат print(stale_links)
Опять же, попытайтесь догадаться, какой результат вернет этот код, прежде чем смотреть на приведенный ниже результат.
В данном регулярном выражении мы анализируем многострочное строковое значение (возможно, старое сообщение из блога) в поисках всех URL, начинающихся со строкового префикса http://. На входе это регулярное выражение ожидает положительное количество символов в нижнем регистре, чисел, знаков подчеркивания, дефисов или точек ([a-z0-9_\-\.]+). Обратите внимание, что мы экранируем дефис (\-), поскольку в регулярных выражениях с его помощью задаются диапазоны внутри квадратных скобок. Аналогично необходимо экранировать точку (\.), поскольку мы хотим найти именно точку, а не произвольный символ. В результате получаем следующее:
## Результаты print(stale_links) # ['http://blog.finxter.com/applications/', 'http://blog.finxter.com/', # 'http://bo.bo.bo.bo.bo.bo/', 'http://bo.bo.bo.bo.bo.bo/333483--33343-/']
Похоже, необходимо перенести на более защищенный протокол HTTPS четыре правильных URL.
Вы уже овладели основными возможностями регулярных выражений. Но действительно глубокого понимания можно достичь, лишь применяя их на практике и изучая большое количество примеров, и регулярные выражения не исключение. Рассмотрим еще несколько примеров того, как регулярные выражения могут облегчить жизнь программиста.
На следующем шаге мы рассмотрим проверку формата времени во вводимых пользователем данных.