Уроки Python 15 - Регулярные выражения

Уроки Python 15 - Регулярные выражения

Регулярные выражения - это специальные шаблоны для поиска и замены строк в тексте. Внутри этих шаблонов используются сокращенные обозначения групп символов. Прежде чем перейти к изучению регулярных выражений следует перечислить эти самые символы. Что они означают и зачем применяются вы поймете позже, дочитав статью до конца, а пока просто перечислим их. Данные символы используются для составления регулярных выражений, но прежде чем мы начнем использовать их, давайте познакомимся с командами модуля re. Этот модуль можно импортировать в начале программы с помощью import re.

re.search(pattern,string)
Данная команда ищет в тексте string первое вхождение шаблона pattern. Команда возвращает группу строк, доступ к которым можно получить через команду group(). Давайте пока попробуем использовать эту команду без применения специальных символов, перечисленных выше. В качестве примера давайте попробуем найти слово "информатика" в тексте.
import re
pattern=r"информатика"
string="В современном мире информатика и информационные системы будут играть решающую роль. Поэтому, информатика - важная наука."
result=re.search(pattern, string)
print(result.group(0))
Программа напечатает: информатика Команда search ищет только первое вхождение шаблона. Поэтому в нашем случае вернется всего один результат - слово "информатика", несмотря на то, что в нашем тексте данное слово присутствует два раза. Чтобы вернуть все вхождения шаблона в текст, используется следующая команда:
re.findall(pattern, string)
Данная команда вернет список строк, которые присутствуют в тексте и совпадают с шаблоном.
import re
pattern=r"информатика"
string="В современном мире информатика и информационные системы будут играть решающую роль. Поэтому, информатика - важная наука."
result=re.findall(pattern, string)
print(result)
Программа напечатает список: ['информатика', 'информатика'] В предыдущих двух примерах программ в качестве шаблона pattern для поиска строк мы использовали просто какое-то слово. Но мощь регулярных выражений не в этом. Помните табличку, которая была вверху статьи? Мы можем заменять части шаблона специальными символами. Давайте, например, попробуем найти в данном тексте все слова, которые начинаются с "инф". Для этого используем символ \b для того, чтобы указать начало слова. Далее укажем с чего должно начинаться слово, и напишем символ w+, который означает, что дальше в шаблоне должны идти какие-то буквы до тех пор, пока не встретится символ не-буква. Шаблон будет выглядеть так: r"\bинф\w+" Обратите внимание, что шаблоны в регулярных выражениях имеют буковку r перед началом строки.
import re
pattern=r"\bинф\w+"
string="В современном мире информатика и информационные системы будут играть решающую роль. Поэтому, информатика - важная наука."
result=re.findall(pattern, string)
print(result)
Программа напечатает список всех слов, начинающихся с "инф": ['информатика', 'информационные', 'информатика'] С помощью знаков из таблички мы сделали шаблон, который позволил нам найти слова, которые ему соответствуют. Давайте попробуем задачу посложнее. Найдем в тексте все e-mail с доменом mail.ru, если они там есть.
import re
pattern=r"\b\w+@mail.ru"
string="Если вы хотите связаться с админом, пишите на почту wbsr@mail.ru. По другим вопросам обращайтесь на iwqn@mail.ru."
result=re.findall(pattern, string)
print(result)
Программа напечатает все слова, которые заканчиваются на @mail.ru ['wbsr@mail.ru', 'iwqn@mail.ru'] Посмотрите внимательно на таблицу знаков, применяющихся в регулярных выражения (в начале статьи). Поищите примеры регулярных выражений в гугле и попытайтесь понять их, исходя из этой таблицы. Часто нам нужно найти какой-то элемент строки, окруженный двумя другими элементами. Например, это может быть url адреса ссылок html кода. Для того, чтобы выделить ту часть шаблона, которую нужно вернуть, используются скобки. Приведем пример, в котором получим все url адреса ссылок из какого-то кусочка html кода.
import re
string='Вы можете посмотреть карту сайта <a href="map.php">тут</a>. Посетите также <a href="best.php"раздел</a>'
pattern=r'href="(.+?)"'
result=re.findall(pattern,string)
print(result)
Программа напечатает две локальных ссылки, которые регулярные выражения вытащили из текста. ['map.php', 'best.php'] Следует немного пояснить, что мы сделали. Мы составили шаблон того, что мы ищем pattern=r'href="(.+?)"' - в этом шаблоне искомая строка начинается с href=" и заканчивается еще одной двойной кавычкой. Скобки нужны для того, чтобы указать какую часть искомого шаблона мы хотим получить в переменную result. Точка внутри скобок указывает, что часть шаблона в скобках может быть любыми символами, кроме символа новой строки. Плюсик и вопросительный знак применяется, чтобы указать что мы ищем ноль или более подходящих под шаблон строк. Кроме поиска мы можем также осуществлять замену строк соответствующих шаблонов на какие-то другие строки. Например, давайте попробуем удалить из html кода все теги. Для этого используется команда:
re.sub(pattern,'на что заменять шаблон',string)
Составим программу:
import re
string='Вы можете посмотреть карту сайта <a href="map.php">тут</a>. Посетите также <a href="best.php"раздел</a>'
pattern=r'<(.+?)>'
result=re.sub(pattern,'',string)
print(result)
Программа напечатает нашу строку уже без наличия в ней тегов. Регулярные выражения - очень мощная штука. Советую прогуглить вам про жадный и нежадный поиск с помощью регулярных выражений, и придумать себе несколько заданий, чтобы вытащить из какого-то текста нужную вам информацию. Кроме того, очень рекомендую онлайн сервис для составления и тестирования регулярных выражений https://regex101.com/

Уроки Python | Регулярные выражения Лого Pythono.ru Уроки Python 15 - Регулярные выражения