От нуля до героя регулярных выражений: создание прочного фундамента в анализе текстовых данных

99% наших сегодняшних данных были получены за последние 10 лет! Это беспрецедентный объем, и прогнозируется, что объем данных, которые мы собираемся генерировать, будет только увеличиваться в геометрической прогрессии. Имея такой объем данных, мы можем получить массу идей, которые мы можем извлечь из этих данных. Однако, имея такой большой объем данных, мы в одиночку не можем столько обработать, и поэтому нам нужна помощь машин.

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

В приведенном выше обзоре мы видим, что клиент поставил авиакомпании оценку 1/10. Однако это мало что говорит нам о том, почему он оценил это так, верно? Вот тут-то и приходят на помощь текстовые данные. Просто посмотрите, сколько информации содержится в этом длинном абзаце текста! Если бы мы смогли извлечь это и проанализировать, мы смогли бы получить гораздо больше информации об услугах авиакомпаний. Здесь нам может помочь регулярное выражение (RegEx). С помощью RegEx мы можем предварительно обработать текстовые данные и передать их в модели машинного обучения, основанные на обработке естественного языка. Используя имеющиеся в нашем распоряжении технологии, мы можем анализировать данные естественного языка и извлекать гораздо более значимые идеи.

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

В этой статье я расскажу об основах RegEx, а точнее, об этих трех темах:

  1. Методы регулярных выражений
  2. Метасимволы регулярных выражений
  3. Классы символов RegEx

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

Методы регулярных выражений

Я представлю 5 основных, но важных методов:

1. поиск()

Основой RegEx является метод search(). Он ищет заранее заданный шаблон во входной строке и возвращает объект соответствия, если совпадение есть. Он принимает два аргумента: шаблон, который вы хотите найти, и строку, в которой вы хотите найти шаблон.

import re
text = "She sells seashell on the seashore"
pattern = "sea"
re.search(pattern,text)

Изображение выше является результатом выполнения кода. Вот что означает возврат объекта Match. Из результатов вы можете получить несколько фрагментов информации. Например, диапазон объекта Match сообщает вам начальный (включающий) и конечный (исключающий) индексы строки, в которой найдено совпадение. В данном случае слово «море» в слове «ракушка» находится в тексте [10:13]. Мы также можем вызвать метод group(), чтобы найти найденное нами совпадение со следующим: re.search(pattern,text).group() и это результат

Однако замечаете ли вы что-нибудь? Правильно, на самом деле в строке два слова «море», а другое находится в слове «берег моря». Это важный момент, на который следует обратить внимание: метод re.search() возвращает только первый экземпляр, в котором найдено совпадение. Именно здесь на помощь приходит метод finditer()!

2. искатель()

Используя finditer(), мы можем получить все совпадения, если их несколько, выполнив следующие действия:

text = "She sells seashell on the seashore"
matches = re.finditer("sea", text)
for match in matches:
  print(match) 

Теперь мы видим, что сюда возвращены оба совпадения! Переходим к следующему методу!

3. найтиалл()

Использование findall() вернет список, содержащий все совпадения, найденные во входной строке. Проще всего это показать на примере. Возвращаясь к нашей текстовой переменной,

text = "She sells seashell on the seashore"
re.findall('sea', text)

Как видно выше, список возвращается для каждого совпадения шаблона «море», найденного в тексте. Сейчас это может показаться не очень полезным, но когда мы углубимся в метасимволы и классы символов RegEx, вы начнете понимать практичность этого метода. Так что имейте это в виду в первую очередь, когда мы будем двигаться вперед!

4. разделить()

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

text = "She sells seashell on the seashore"
re.split('sea', text)

Этот метод аналогичен обычному встроенному в Python методу разделения строк(), но он является лучшей альтернативой для случаев, когда требуется сопоставление нескольких символов. Как видно из выходных данных, текст разбивается на список на основе любого экземпляра слова «море» в нем. Таким образом, указанный шаблон не будет присутствовать в списке.

5. суб()

Теперь мы можем перейти к последнему методу, о котором поговорим в этой статье, — методу sub(). Интуитивно это можно рассматривать как замену указанного шаблона чем-то другим. re.sub() принимает 3 параметра.

  1. Узор, который подойдет
  2. Строка для замены, если найдено совпадение.
  3. текст, в котором нужно найти шаблон
text = "She sells seashell on the seashore"
re.sub('sea','crab',text)

Простите меня за фразу, не имеющую большого смысла. Это полностью для иллюстративных целей.

Метасимволы регулярных выражений

Теперь мы можем перейти к метасимволам RegEx!

До сих пор мы научились сопоставлять только очень специфические шаблоны, которые, как мы знаем, существуют в тексте. Извините, что нарушаю ваш пузырь, но, к сожалению, в реальном мире это не всегда так. Что делать, если мы хотим сопоставить строки, которые, как мы знаем, имеют определенный формат, но не уверены, что это за строка? Здесь могут помочь метасимволы! Метасимволы — это, по сути, специальные символы в RegEx, которые могут изменить способ указания искомого шаблона.

Давайте посмотрим на некоторые метасимволы!

ВАЖНОЕ ПРИМЕЧАНИЕ

Прежде чем перейти к метасимволам, я должен рассказать вам, что такое необработанная строка. Необработанная строка — это строка с префиксом «r» в начале строки. Например string = r'This is a raw string' . Он сообщает Python интерпретировать обратную косую черту («\») как буквальные символы. Обычно, имея дело с RegEx, мы всегда конвертируем шаблон, который хотим сопоставить, в необработанную строку, чтобы не возникало проблем при поиске ожидаемого шаблона. Разобравшись с этим, давайте перейдем к метасимволам!

[ ] (квадратные скобки)

Квадратные скобки позволяют сопоставить набор символов, указанный в скобках. Например, давайте посмотрим на эту строку string = "The quick brown fox jumped over 32412 fences". Мы могли бы написать re.findall('[a-zA-Z]', string) . Это позволяет нам сопоставлять все значения в строке, которые являются буквами нижнего или верхнего регистра. Если мы хотим использовать только цифры, мы могли бы написать re.findall('[0-9]',string) . Оба эти кода будут возвращать каждый отдельный элемент, соответствующий шаблону.

. (точка)

Символ точки действует как подстановочный знак. Он соответствует каждому символу (даже пробелам), кроме новой строки ( "\n" ). При использовании точки следует соблюдать осторожность: из-за этого метасимвола, если мы хотим найти точку конкретно в шаблоне, нам придется использовать обратную косую черту («\»), чтобы указать Python, что мы хотим обработать точку. период в буквальном смысле.

Как видно выше, знак точки соответствует всему. Однако, если бы мы хотели сопоставить только точку, нам пришлось бы добавить к ней обратную косую черту как таковую.

{} (фигурные скобки)

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

Опять бессмысленное предложение, но просто для иллюстрации функциональности использования точки и фигурных скобок. В этом шаблоне мы пытаемся один раз сопоставить букву «s», за которой следует любой символ, а затем буква «e». Следовательно, «видеть», «подавать в суд» и «она» были сопоставлены.

^/$ (Знак карата/доллара)

Символ карата указывает, что искомый шаблон появляется в начале строки, а символ доллара представляет конец строки.

В приведенном выше случае "seashore" не найдено, поскольку оно не находится в начале строки. Однако если бы мы заменили его на «$», мы бы получили совпадение.

Важно обратить внимание на расположение «^» и «$». «^» должен находиться перед шаблоном, которому вы хотите сопоставить, а «$» — позади него.

*/+/? (Звездочка/Знак плюса/Знак вопроса)

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

«*» — звездочка проверяет, встречается ли предыдущий шаблон ноль или более раз.

«+» — вероятно, наиболее распространенный метасимвол, используемый в RegEx. Знак + проверяет, встречается ли предыдущий шаблон один или несколько раз.

Здесь + проверяет, встречается ли буква «L» хотя бы один раз. Поскольку это так, оно также соответствует всем буквам «L» после него.

« ? ” — Знак вопроса проверяет, встречается ли предыдущий символ ноль или один раз. Однако это используется редко, поскольку вариант использования очень специфичен.

Классы символов RegEx

Наконец, давайте посмотрим на некоторые классы персонажей! В таблице ниже показаны наиболее распространенные классы символов, которые вы можете использовать для RegEx!

Обратная косая черта («\») в начале позволяет нам указать, что символ, следующий за ним, является специальным символом, и, таким образом, позволяет RegEx выполнять над ним операции.

\d и \D

\d соответствует любой цифре в строке. Он имеет ту же функциональность, что и сопоставление с образцом[0–9].

\D соответствует любой нецифре в строке. Полезно отметить, что версия класса символов, написанная с заглавной буквы, по сути является отрицанием версии со строчными буквами. Будет сопоставлено все, что не является числом.

В этом примере после \D добавляется +, что означает, что он будет соответствовать одному или нескольким вхождениям нецифрового символа. RegEx найдет первое вхождение нецифрового символа и сопоставит все, пока не встретит цифровой символ, которым в данном случае является 32412.

\w и \W

\w соответствует любому символу слова. Однако термин «символ слова» может здесь ввести в заблуждение. Символ слова в RegEx включает буквы, цифры и символ подчеркивания («_»). Поэтому вы также можете записать это как [a-zA-Z0-9_] .

Здесь знак +помогает нам сопоставить каждое слово в тексте. Это очень распространенный способ использования знака +!

Опять же, \W соответствует всему, кроме указанных выше символов.

\s и \S

\s соответствует любому символу пробела. Сюда входят пробелы " ", новые строки \n и табуляции \t.

\S будет соответствовать всему, что не является символом пробела.

Совпадающие адреса электронной почты

Наконец, теперь, когда мы рассмотрели основы RegEx, давайте посмотрим, как мы можем использовать эти инструменты, которые мы научились, для сопоставления адресов электронной почты!

Этот шаблон [\w._%+-]+означает, что мы хотим сопоставить любой символ слова или такие символы, как ".” “_" “%" “+” “-”. . Это связано с тем, что эти символы иногда могут появляться в имени пользователя электронного письма! А знак + в конце квадратных скобок означает, что мы хотим сопоставить его как можно больше раз. Затем мы хотим сопоставить знак «@», за которым следует [\w.-]+, сопоставляя больше слов и дополнительных символов. Затем мы хотели бы сопоставить одну точку, используя \., за которой следует любой алфавит в верхнем или нижнем регистре, сопоставляя их как минимум два раза, но не более 4 раз. Это может показаться очень загадочным, если вы не знакомы с RegEx. Однако я надеюсь, что теперь это имеет для вас смысл!

Заключение

Изучив эти три раздела RegEx, вы, вероятно, поняли, насколько мощным может быть регулярное выражение! Имея в запасе эти трюки с RegEx, вы теперь можете манипулировать текстом. Это важный первый шаг к возможности выполнять обработку естественного языка (НЛП) и извлекать ценную информацию из текстовых данных! Веселиться!

Свяжитесь со мной!

LinkedIn
Электронная почта: [email protected]