Шаг 80.
Однострочники Python.
Регулярные выражения. Поиск небезопасных HTTP URL

    На этом шаге мы рассмотрим алгоритм решения этой задачи.

    Данный однострочник демонстрирует, как решить одну из тех маленьких, но требующих много времени задач, с которыми так часто сталкиваются веб-разработчики. Допустим, вы ведете блог по программированию и только что перевели свой сайт с небезопасного протокола 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.


Пример 5.5. Однострочное решение для поиска правильных URL вида http://
## Зависимости
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.

    Вы уже овладели основными возможностями регулярных выражений. Но действительно глубокого понимания можно достичь, лишь применяя их на практике и изучая большое количество примеров, и регулярные выражения не исключение. Рассмотрим еще несколько примеров того, как регулярные выражения могут облегчить жизнь программиста.

    На следующем шаге мы рассмотрим проверку формата времени во вводимых пользователем данных.




Предыдущий шаг Содержание