При работе с данными мы редко сталкиваемся с чистыми и обработанными данными. Прежде чем эти данные можно будет использовать где угодно, нам нужно применить к ним много обработки, чтобы сделать их хоть какими-то полезными. Одним из таких методов является сопоставление с образцом в строках, позволяющее сохранить только нужный образец или, наоборот, удалить нежелательные образцы. Мы находим эти шаблоны в строках с помощью Регулярных выражений или Регулярных выражений для краткости. Regex — это международно признанный набор правил для определения форматирования строки.



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

Понимание регулярных выражений: регулярное выражение 101

Regex — это набор правил, определенных для поиска шаблонов в строках.

Regex определяются набором символов. Есть обычные символы, а есть определенные специальные символы. Вместе они используются для определения вашего регулярного выражения.

Обычные персонажи

Это основные буквенные, числовые или символические символы, которые мы используем каждый день. Они в основном используются в сценарии точного совпадения. Например, если я хочу найти все восклицательные знаки в фрагменте текста, мое регулярное выражение будет просто ‘!’. То же самое относится к сопоставлению целых слов или предложений как таковых.

Специальные символы

То, что мы обсуждали выше, — это сопоставление строк, но на самом деле регулярные выражения используются не для этого. Эти выражения создаются для сопоставления сложных шаблонов в тексте, и именно здесь мы используем специальные символы. В таблице ниже представлены некоторые из наиболее часто используемых специальных символов.



Описание персонажа

  • . (Точка): соответствует любому символу, кроме символа новой строки.
  • * (звездочка): соответствует 0 или более символов, указанных предшествующим символом.
  • + (плюс): соответствует как минимум 1 или более вхождениям термина, указанного предшествующим символом.
  • ^ (вставка): соответствует началу строки.
  • $ (доллар): соответствует концу строки.
  • ? (Вопросительный знак): результирующий RE соответствует 0 или 1 повторению предыдущего RE. 'ab?' будет соответствовать либо «a», либо «ab».
  • {m}: соответствует ровно m вхождениям предыдущего регулярного выражения
  • {m,n}: соответствует как минимум m и почти n вхождениям предыдущего регулярного выражения.

Давайте рассмотрим несколько примеров, мы будем использовать следующий текст из книги Гарри Поттер и философский камень.

И все же Гарри Поттер все еще был там, спал в данный момент, но ненадолго. Его тетя Петунья проснулась, и ее пронзительный голос произвел первый шум за день.

"Вверх! Вставать! Сейчас!"

Гарри проснулся вздрогнув. Его тетя снова постучала в дверь.

-Гарри Поттер и философский камень.

Если вы хотите сопоставить точную строку, все, что вам нужно сделать, это передать эту точную строку в качестве выражения. Например, если вы хотите найти Гарри Поттера в приведенном выше тексте, вы напишите «Гарри Поттер» в качестве выражения.

Вы можете указать регулярное выражение, чтобы найти только определенный набор символов или чисел. Вы также можете указать его для поиска только буквенных символов или только цифр в определенном тексте. Это делается с помощью квадратных скобок ‘[]’. Квадратные скобки заключают в себе набор символов, которые мы хотим, например. если нам нужны только буквенные символы, мы напишем это так:

[A-Za-z]

Это определяет 2 диапазона символов; от A до Z и от a до z (убедитесь, что совпадение нечувствительно к регистру). Мы также можем указать соответствие всем символам в тексте.

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

".*"

Приведенное выше выражение можно прочитать как:

  • “: Найдите кавычки
  • . : искать любой символ после этого
  • *: Относится к предыдущему символу. Ищите любое количество вхождений символа, указанного предшествующим символом (точка в нашем случае — поэтому он будет искать любое количество вхождений любого символа)
  • “: Найдите другую кавычку, чтобы завершить поиск

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

Все это может показаться трудным для понимания. Регулярные выражения могут быть очень сложными для понимания, и единственный реальный способ понять их — это попрактиковаться. Поэтому вместо того, чтобы просто писать их, мы теперь увидим их в действии на Python. Если вы новичок в python, вы можете начать читать эту статью в первую очередь.



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

Прочтите до конца, чтобы получить бонусный совет (вы не хотите его пропустить).

Вы можете опробовать весь код, использованный в этом руководстве, клонировав следующий репозиторий. "Кликните сюда".

Если вы хотите научиться создавать блокнот Jupyter, как в каталоге git, читайте здесь

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

import re

Теперь давайте найдем какой-нибудь текст, где нам нужны совпадения.

txt = '''We have contacted Mr. Jhon Doe and havbe confirmed that he will be joining us for the meeting this evening.
If you would like to contact him yourself you can call him on +1-415-5552671 or email him at [email protected].
We also have the contact details of his assistant, you can contact him in case Mr. Doe does not respond.
The assistants email id is [email protected].'''

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

Начнем с электронной почты.

email_regex = '\S+@{1}\S+(.com){1}'
x = re.search(email_regex, txt) #regex to find an email address
print(email_regex) #print out the result

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

Давайте сначала посмотрим, как читать это регулярное выражение.

  • \S: находит непробельный символ.
  • +: указывает, что нужно найти 1 или более вхождений без пробелов.
  • @: точное совпадение указывает, что нужно найти символ «@».
  • {1}: указывает, что нужно найти только 1 символ «@».
  • \S: снова указывает на поиск непробельных символов.
  • +: найти хотя бы 1 непробельный символ.
  • (.com): найти точное соответствие для .com
  • {1}: найти ровно одно вхождение для ".com"

Функция re.search() возвращает только первое совпадение. Цель этой функции не более чем узнать, присутствует совпадение или нет. В библиотеке 're' есть много других полезных функций, которые мы можем использовать.

Найти все вхождения

Чтобы вернуть все совпадения предоставленного регулярного выражения, мы используем функцию re.findall().

emails = re.findall(r'\S+@{1}\S+(?:\.com)', txt) #finding all emails
print(emails)

Здесь есть одно небольшое отличие, на которое следует обратить внимание. Я немного изменил регулярное выражение при использовании его в функции re.findall(). Причина этого в том, что функция «findall()» возвращает любую группу, которую она находит в регулярном выражении. Когда мы указали (.com) в конце, он обработал его как группу и вернул только эту группу, а не все совпадение. Когда мы помещаем «?:» в круглые скобки, это указывает на группу без захвата (согласно документации), и функция возвращает полное совпадение.

Подставить выражения

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

Это делается с помощью функции re.sub().

substituted_string = re.sub(r'\S+@{1}\S+(.com){1}', '', txt) #remove emails from the given text.
print(substituted_string)
We have contacted Mr. Jhon Doe and havbe confirmed that he will be joining us for the meeting this evening. If you would like to contact him yourself you can call him on +1-415-5552671 or email him at . We also have the contact details of his assistant, you can contact him in case Mr. Doe does not respond. The assistants email id is .

Как вы можете видеть в тексте выше, электронные письма были заменены пустой строкой. Это хороший способ удалить нежелательные элементы из вашего текста.

Еще одно хорошее применение этого — редактирование документов. Допустим, мы хотим переслать вышеуказанный текст кому-то, но хотим скрыть электронные письма. Мы можем просто сделать это как.

redacted = re.sub('\S+@{1}\S+(.com){1}', '<email>', txt) #place emails tags in text
print(redacted)
We have contacted Mr. Jhon Doe and havbe confirmed that he will be joining us for the meeting this evening. If you would like to contact him yourself you can call him on +1-415-5552671 or email him at <email>. We also have the contact details of his assistant, you can contact him in case Mr. Doe does not respond. The assistants email id is <email>.

Наш получатель теперь знает, что определенная часть должна содержать адрес электронной почты, но фактический адрес скрыт от них.

Несколько выражений в одной строке.

Мы указываем Python для поиска нескольких выражений с использованием одного и того же регулярного выражения. Это делается путем разделения двух выражений с помощью символа | (бар) символ. Полное выражение будет выглядеть так

(exp1)|(exp2)|(exp3)

Мы можем указать столько выражений, сколько захотим. Полоса читается как ИЛИ, и Python предлагается найти выражение 1 ИЛИ выражение 2 ИЛИ выражение 3.

Давайте попробуем. Мы видим, что в нашем тексте также есть номер телефона. Давайте удалим всю контактную информацию из текста.

re.findall('\S+@{1}\S+[.com]{1}|\+[0-9]{1}-[0-9]{3}-[0-9]{7}', txt)

Похоже, наша строка с несколькими регулярными выражениями работает нормально.

#tagging all contact information as confidential
redacted = re.sub('\S+@{1}\S+[.com]{1}|\+[0-9]{1}-[0-9]{3}-[0-9]{7}', '<confidential>', txt)
print(redacted)
We have contacted Mr. Jhon Doe and havbe confirmed that he will be joining us for the meeting this evening. If you would like to contact him yourself you can call him on <confidential> or email him at <confidential> We also have the contact details of his assistant, you can contact him in case Mr. Doe does not respond. The assistants email id is <confidential>

БОНУС СОВЕТ!!

Если вы хотите попрактиковаться в регулярных выражениях и посмотреть, что делает ваше конкретное регулярное выражение, то r egexr.com — очень полезный инструмент.

Последние мысли

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