Введение в регулярное выражение с использованием Python

Вам вообще нужно учить регулярные выражения?

Согласно Википедии, регулярное выражение - это последовательность символов, определяющих шаблон поиска. Другими словами: это комбинация букв, цифр и символов, которую мы можем использовать для поиска в большом тексте :)

В мире технологий обсуждение того, как обязательные es для изучения регулярных выражений для программиста, можно увидеть в Интернете на Stackoverflow, Quora и многих других подобных сайтах:

И да, некоторые из этих вопросов возникли совсем недавно, в основном из-за некоторых новых инструментов и языков программирования, которые упрощают работу с Regex косвенно, без фактической неразберихи вокруг него. Однако последний вопрос задан более семи лет назад! В Stackoverflow есть и другие, даже старше. Итак, вы можете видеть, как долго обсуждается Regex и его обязательность 😅.

Фактически, около одиннадцати лет назад Джефф Этвуд, соучредитель Stack Overflow, написал в своем блоге Ужас программирования, который стал столь же знаменитым, как и стал полемическим, под названием Регулярные выражения: теперь у вас две проблемы. всего три года спустя после написания еще одного поста под названием Если тебе так нравятся регулярные выражения, почему бы тебе не выйти за них замуж? Хорошо… Я буду! »’

На этом этапе было бы более чем справедливо, если бы вы думали о таких вещах, как:

  • «Очевидно, что это регулярное выражение слишком сложно… вероятно, оно того не стоит»
  • "Хорошо, Джефф Этвуд сумасшедший как чокнутый ... это определенно вина регулярного выражения"

Но подождите, прежде чем вы наткнетесь на дверь на пути к выходу, позвольте мне сказать вам, что, хотя это правда, регулярное выражение сложное и запутанное, вероятно, оно того стоит. И эта двойственность между полезностью и сложностью или между любовью и ненавистью, если хотите, была именно тем, что Джефф Этвуд пытался выразить в своем втором рассказе. Фактически, даже почти в начале своей последней публикации Этвуд цитирует Джейми Завински, когда еще в 1997 году он сказал:

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

Он также заявляет следующее о своем собственном взгляде на регулярные выражения:

Регулярные выражения качают. Они обязательно должны быть ключевой частью инструментария каждого современного программиста. (…) Вот что Джейми пытался донести: не то, что регулярные выражения - зло сами по себе, а то, что злоупотребление регулярными выражениями - зло. Я не мог с этим согласиться. Регулярные выражения подобны особенно острому острому соусу - их следует использовать умеренно и сдержанно только тогда, когда это уместно. Стоит ли пытаться решить каждую возникающую проблему с помощью регулярного выражения? Ну нет

Итак, в конце концов, множество вопросов и ответов. Тот же самый Джефф Этвуд, по-видимому, научился одновременно ненавидеть и любить регулярные выражения. Стоит ли чему-то учиться? Позвольте мне кратко изложить все ответы, которые я прочитал через Stackoverflow и Quora:

  • Это что-то обязательное для изучения? НЕТ
  • Собираюсь ли я использовать его ежедневно или даже еженедельно? ВОЗМОЖНО НЕТ
  • Вам важно знать и понимать этот инструмент? ДА
  • Может ли это быть очень эффективным и полезным для некоторых задач? ОПРЕДЕЛЕННО ДА
  • Нужно ли мне в совершенстве знать об этом каждую мелочь? ВОЗМОЖНО НЕТ

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

Вот почему идея этой истории состоит в том, чтобы охватить основные и базовые сведения о регулярных выражениях. Итак, вы можете начать с практического приложения и убедиться, что регулярное выражение не так уж и ужасно (когда у вас есть подходящее руководство и Google под рукой 😅).

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

Идея состоит в том, чтобы вы практиковали следующие примеры и инструменты так, как мы их видим, поэтому в первую очередь нам нужно знать, как использовать регулярное выражение в Python. Однако имейте в виду, что для использования регулярных выражений вам не обязательно нужны блокноты Python или Jupyter. Его даже можно использовать через Терминал и на нескольких других языках. К сожалению, не все программы, команды и языки программирования используют одни и те же регулярные выражения, но все они очень похожи.

Начнем с импорта библиотеки:

import re

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

text = ‘those THAT tilt that That 8’
  1. Использование только функции re.findall
In: re.findall(r’[Tt]h[^i][st]’, text)
Out: [‘thos’, ‘that’, ‘That’]

2. Используя re.compile:

In: pattern = re.compile(r’[Tt]h[^i][st]’)
In: re.findall(pattern, text)
Out: [‘thos’, ‘that’, ‘That’]

Почему этот шаблон возвращает слова «thos», «that» и «That» из нашей строки? Не волнуйтесь, мы объясним это в следующем разделе 🙂.

Основные утилиты и синтаксис

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

Включая обычные строки: символы, которые мы обычно называем строками в Python, в мире регулярных выражений называются «литералами». Однако, несмотря на это, их использование не имеет никакого значения. Такие символы, как a, g, t, r, m или даже числа, могут быть включены в любое особое соображение. Так, например, если бы мы хотели найти букву «т» в предыдущем тексте, мы бы сделали следующее:

In: re.findall(r’[t]’,text)
Out: [‘t’, ‘t’, ‘t’, ‘t’, ‘t’, ‘t’] #check by yourself if we had 6 lower case ‘t’s in our text

Совет: помните, что регулярное выражение чувствительно к регистру, просто указывая литералы!

Использование классов символов: эта утилита указывает регулярное выражение для поиска одного ИЛИ другого символа в группе. Группа будет указана в квадратных скобках. Возьмем следующий пример:

In: re.findall(r’[tT]’,text)
Out: [‘t’, ‘T’, ‘T’, ‘t’, ‘t’, ‘t’, ‘t’, ‘T’, ‘t’]

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

In: In : pattern = re.compile(r’t’, flags=re.IGNORECASE)
In: re.findall(pattern, text)
Out: [‘t’, ‘T’, ‘T’, ‘t’, ‘t’, ‘t’, ‘t’, ‘T’, ‘t’]

Имейте в виду, что классы символов также могут использовать диапазоны. Это, собственно, и делает их такими популярными! Например, вот как мы можем сопоставить любую строчную букву между «a» и «z»:

In: re.findall(r’[a-z]’,text)
Out: [‘t’, ‘h’, ‘o’, ‘s’, ‘e’, ‘t’, ‘i’, ‘l’, ‘t’, ‘t’, ‘h’, ‘a’, ‘t’, ‘h’, ‘a’, ‘t’]

Синтаксис отрицания: для любого из случаев, которые мы видели до сих пор, а также для любого другого выражения в регулярном выражении, вы можете использовать отрицание, просто используя символ «^» следующим образом:

In: re.findall(r’[^a-zA-Z]’,text)
Out: [‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘8’]

В приведенном выше примере мы возвращаем только пробелы и единственное число в строке, так как мы исключаем любую букву между «a» и «a», как строчные, так и прописные.

Прежде чем перейти к следующей утилите, не уверен, что вы поняли, но мы уже видели достаточно, чтобы понять наш первоначальный пример! Давайте вернемся к этому:

text = ‘those THAT tilt that That 8’
In: re.findall(r’[Tt]h[^i][st]’, text)
Out: [‘thos’, ‘that’, ‘That’]

Разбивая его по частям, мы можем увидеть:

  • Во-первых, мы используем диапазон классов для всего, что соответствует "t" или "T".
  • После этого мы обозначаем все, что следует за буквой «h»
  • Позже мы используем отрицание, чтобы привести что-либо, за которым не следует «i».
  • И, наконец, любое слово, оканчивающееся на "и" или "т"

Обратите внимание на то, как слово «те» обрывается у «s», поскольку мы не уточняем там ничего.

Ярлыки и специальные символы

Если вы видели написанные ранее регулярные выражения, то, вероятно, ваше внимание привлекло количество используемых обратных косых черт. И для этого есть веская причина: регулярное выражение включает в себя множество сокращений, поэтому вам не нужно писать вечные выражения с множеством символов. Вы, вероятно, сначала не запомните их все (или, может быть, это только я с трудом запоминаю небольшие фрагменты кода, когда мне приходится их использовать? 😂), но будет удобно, если они будут под рукой:

\ w - соответствует символам слова (включая цифры и символы подчеркивания)

\ W - соответствует тому, чего не соответствует \ w - несловесным символам.

\ d - Соответствует всем цифровым символам - Цифры: [0–9]

\ D - соответствует всем нецифровым символам

\ s - соответствует пробелам (включая табуляции)

\ S - соответствует без пробелов

\ n - соответствует новым строкам

\ r - соответствует возврату каретки

\ t - соответствует вкладкам

Все это можно использовать в классах символов и / или с отрицанием. Давайте посмотрим на несколько примеров:

# Get everything but blank spaces
In: re.findall(r’[\w]’,text)
Out: [‘t’, ‘h’, ‘o’, ‘s’, ‘e’, ‘T’, ‘H’, ‘A’, ‘T’, ‘t’, ‘i’, ‘l’, ‘t’, ‘t’, ‘h’, ‘a’, ‘t’, ‘T’, ‘h’, ‘a’, ‘t’, ‘8’]

— —

# Get only blank spaces
In: re.findall(r’[\W]’,text)
Out: [‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘]

— —

# Match all that’s NOT a non-digit characters → all characters that are not letters
In: re.findall(r’[^\D]’,text)
Out: [‘8’]

— —

# Match word characters and white spaces → everything but the eight
In: re.findall(r’[\D\s]’,text)
Out: [‘t’, ‘h’, ‘o’, ‘s’, ‘e’, ‘ ‘, ‘T’, ‘H’, ‘A’, ‘T’, ‘ ‘, ‘t’, ‘i’, ‘l’, ‘t’, ‘ ‘, ‘t’, ‘h’, ‘a’, ‘t’, ‘ ‘,‘T’, ‘h’, ‘a’, ‘t’, ‘ ‘]

Что ж, думаю, этого более чем достаточно, чтобы понять, как работают ярлыки, не так ли? Последнее, что мы увидим в этом посте, - это то, что для включения специальных символов мы должны снова экранировать их с помощью обратной косой черты.

Специальные символы регулярного выражения:

. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

Квантификаторы

Это простой и простой инструмент, но он также очень важен. Это поможет вам сопоставить, сколько символов вы хотите вернуть в соответствии с вашим выражением:

* - Ноль или несколько
+ - Один или несколько
? - Ноль или один
{n} - Ровно n число
{n,} - Соответствует n или более вхождений
{n, m} - Между n и m '

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

  • Якоря
  • Группы и захват
  • Чередование
  • Взгляд вперед и взгляд назад

Наконец, очень хороший источник, чтобы продолжить читать об этом: https://www.regular-expressions.info/

Если вам нравится эта история, не забудьте ознакомиться с некоторыми из моих последних статей, например:

Все они и многое другое доступны в Моем среднем профиле. И если вы хотите получать мои последние статьи прямо на вашу электронную почту, просто подпишитесь на мою рассылку :)

Увидимся в Medium!

Примечание: для этой истории я использовал материалы моего Иммерсивного курса науки о данных, проведенного Генеральной Ассамблеей в Лондоне.