Python. Регулярные выражения

Достаем из текстов нужные нам детали

Дата
26 февр. 2021
Python. Регулярные выражения

Без регулярных выражений просто невозможно обойтись дата-журналисту. Они помогают находить нужные детали в больших текстах. Когда мне приходится работать с текстами судебных решений, что-то извлекать из них, например, был ли человек в состоянии алкогольного опьянения, ранее судим, признал ли свою вину, а также какое наказание ему назначил суд, я всегда использую регулярные выражения. С их помощью я прописываю шаблоны для поиска нужных мне сущностей. И хоть про регулярки обычно шутят, что если у вас есть какая-то проблема и вам нужно решить ее с помощью регулярных выражений — теперь у вас есть две проблемы. Но давайте попробуем разобраться.

Видео: Глеб Лиманский

Для того, чтобы работать с регулярными выражениями нужно сначала импортировать библиотеку re для этого. В этой библиотеке есть несколько разных методов, но я расскажу о четырех самых часто мною используемых. А целиком изучить их вы сможете в документации библиотеки.

С чем вообще работаются регулярные выражения? У вас есть какая-то строчка, в которой нужно найти что-то конкретное. Для этого мы сначала прописываем название библиотеки, затем метод поиска, а в скобках сам шаблон и через запятую указываем строчку, в которой хотим искать. Например, метод match() ищет по заданному шаблону только в начале строки. Например, в строчке «суд приговор суд» этот метод сможет отыскать слово «суд» — оно есть в самом начале.

Но если этот же метод использовать для поиска слова «приговор», то вы ничего не найдете.

Зато метод search() может справиться с этой задачей: он ищет по всей строке, но возвращает только первый результат, который найдет. Если мы будем искать слово «суд», то вернется только один результат.

Если же нужно найти все соответсвующие критериям поиска сущности, то нужно использовать метод findall(). В виде списка он вернет все найденные совпадения.

И еще один метод — sub(). С его помощью вы можете заменить найденный шаблон на что-то другое. Например, в строке «Судья Нагатинского районного суда вынесла обвинительный приговор» можно сначала найти слово «обвинительный», а потом заменить его на слово «оправдательный».

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

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

Для поиска любых символов кроме пробельных можно использовать оператор \w+. Так в строке найдутся все отделенные пробелами слова.

Затем нам нужно указать, что за слово идет пробел. Для этого нужен оператор \s. И теперь нам вернутся только те слова, после которых есть пробел. Инициалы из нашей выдачи исчезнут.

Теперь на нужно указать, что после пробела идет одна буква. Для этого в квадратных скобках пропишем, что ищем все буквы русского алфавита, большие и маленькие. А рядом в фигурных скобках укажем, сколько должно быть этих букв. Дальше с помощью \ пропишем, что должна быть строчка. \ используется здесь, чтобы подчеркнуть, что мы ищем точку, потому что сама по себе точка тоже является оператором и означает любой символ кроме переноса строки. Конструкцию с поиском буквы и точки нужно прописать дважды, так как мы хотим достать инициалы целиком.

Еще можно подстраховаться и учесть, что между инициалами могут поставить пробел. Для этого между ними поставим оператор \s*. Звездочка обозначает, что конструкция слева как может быть, так может и не быть в строке. А также давайте подстрахуем себя и перепишем \w+ на [А-ЯЁа-яё]+, чтобы обезопасить себя от случаев, когда вместо фамилии на встретится например число, но после него будет пробел, буква, точка, буква, точка. Мы получим ненужный результат в таком случае.

Теперь давайте поработает с реальным текстом приговора. Найдем в нем, какое наказание назначил судья. В конце документа есть строчка «назначить уголовное наказание в виде лишения свободы сроком 10 (десять) лет». Фраза «10 (десять) лет» — это то, что мы хотим найти. Поэтому мы указываем, что наше выражение начинается с «сроком», затем с помощью оператора .+ указываем, что тут могут идти некоторые символы, а после них слово «лет».

С таким шаблоном мы тут же отыщем то, что нам нужно, но его нужно сделать более универсальным. Например, нужно предусмотреть, что срок бывает не только ровный — сколько-то лет, но и с месяцами. Например, 10 лет и 6 месяцев. Или просто 6 месяцев. Поэтому нам нужно прописать, что слово «лет» как может быть в выражении, так и нет с помощью *. И добавить конструкцию для поиска слова «месяц» с любым окончанием. И также указать, что и эта часть как может быть, так и нет.

И можем для удобства оформить это все в функцию.

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

Поделиться