Полное руководство

Шпаргалка по RegEx - Python

Обновите свой метод поиска с помощью RegEx!

Вы когда-нибудь чувствовали себя сбитыми с толку, пытаясь извлечь ценную информацию из строки символов? Я должен признать, что это похоже на «найти иголку в стоге сена», если только вы не знаете регулярное выражение!

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

1. Ema Dough (+1-202-555-0189) - 915 Ridge Street Corpus, TX 78418
2. Tom Hitt (+33-93-751-3845) - 9190 Berkshire Ave. Wayne, NJ 07470
3. Maya Raine (+49-30-833-931-313) - 18 SW. Sage Ave. Ride, CA 95993

Потребуется много работы, чтобы перебрать все предложения и найти числа в скобках. Это действительно так, пока не появятся регулярные выражения нашего спасителя (regex)!

Что такое регулярные выражения?

Регулярное выражение - это расширенный метод поиска по строкам, который позволяет пользователям искать что-то в тексте. Это делается путем создания шаблона, который соответствует информации, которую мы хотим получить. Регулярные выражения обладают такой мощностью, что они включены во многие языки программирования, такие как Python, Pearl, JavaScript, PHP и Java.

Итак, вернемся к нашей проблеме!

Мы можем получить номера телефонов пользователей, сначала создав шаблон. Обратите внимание, что номера телефонов заключены в квадратные скобки «()». Это полезная информация, и мы можем использовать ее в своих интересах. Чтобы получить доступ к регулярным выражениям в Python, нам нужно будет импортировать библиотеку re.

import re 
phone_numbers = [] 
pattern = r"\(([\d\-+]+)\)"
with open("log.txt", "r") as file: 
    for line in file: 
        result = re.search(pattern, line)
        phone_numbers.append(result.group(1))
print(phone_numbers)

Выход:

['+1-202-555-0189', '+33-93-751-3845', '+49-30-833-931-313']

Я пропущу этот код один за другим:

  1. import re - Импорт библиотеки регулярных выражений в Python.
  2. phone_numbers = [] - Подготовка списка для хранения телефонных номеров.
  3. pattern = r ”\ (([\ d \ - +] +) \)” - Шаблон, который мы используем для поиска номера телефона, мы рассмотрим, что делает каждый символ позже в этой статье!
  4. с open («log.txt», «r») в качестве файла: - Открытие файла, который мы хотим обработать.
  5. для строки в файле: - Итерация (просмотр) каждой строки в файле log.txt.
  6. result = re.search (шаблон, строка) - Поиск телефонного номера в строке
  7. phone_numbers.append (result.group (1)) - Добавление номера телефона клиента в список телефонных номеров.
  8. print (phone_numbers) - Распечатывает список телефонных номеров.

В библиотеке re есть много полезных функций и персонажей, но изучение всего может быть ошеломляющим. Поэтому я выбрал наиболее полезные функции и символы, которые помогут вам начать реализацию RegEx в вашем скрипте Python.

Начнем нырять в библиотеке re!

Необработанная строка RegEx

В нашем примере мы используем этот шаблон в log.txt: r ”\ (([\ d \ - +] +) \)”

Вам интересно, почему мы должны вводить букву «r» перед строкой? «R» здесь означает необработанную строку. Python RegEx использует обратную косую черту (\) для обозначения специальной последовательности или в качестве escape-символа. Это противоречит тому, что Python использует обратную косую черту (\) для той же цели в боковой строке. Таким образом, здесь используется необработанная строка, чтобы избежать путаницы между ними. Кроме того, это также помогает нам сделать наш узор короче. Без ввода «r» может потребоваться ввести «\\\\» только для обозначения обратной косой черты (\).

Так что не забывайте свое «р»!

Специальные последовательности регулярных выражений

Мы начнем с простейшего синтаксиса RegEx - специальных последовательностей. Специальные последовательности в RegEx начинаются с обратной косой черты (\). Так что, если вы встретите обратную косую черту в шаблоне RegEx, скорее всего, это синтаксис для специальной последовательности.

\d               matches a single digit character [0-9]
\w               matches any alphabet, digit, or underscore
\s               matches a white space character (space, tab, enter)

Отрицания этих последовательностей также доступны с помощью заглавной буквы. Например, \ D - это отрицание \ d.

\D               matches a single non-digit character

Мета-символы RegEx

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

.                matches any character(except for newline character)
^                the string starts with a character
$                the string ends with a character
*                zero or more occurrences 
+                one or more occurrences
?                one or no occurrence 
{}               exactly the specified number of occurrences
|                either or

Пример :

"c.t"            will match anything like "cat", "c*t", "c1t", etc
"^a"             will match "a" from "a cat" but not "eat a cake"
"cat$"           will match "a cat" but not "cat party"
"a*b"            will match "b", "ab", "aab", "aaab", ...
"a+b"            will match "ab", "aab", "aaab", ...
"a?b"            will match "b" or "ab"
"a{1}b"          will match "ab"
"a{1,3}b"        will match "ab", "aab", or "aaab"
"cat|dog"        will match "cat" or "dog"

Наборы RegEx

Наборы могут использоваться для соответствия одному из символов в квадратных скобках.

[abcd]           matches either a, b, c or d

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

[a-z0-9]         matches one of the characters from a-z or 0-9
[\w]             matches an alphabet, digit, or underscore

Символ каретки (^) означает исключение.

[^\d]            matches a character that is not a digit [0-9]

Чтобы включить в набор символы, которые имеют особое значение, такие как обратная косая черта (\) и тире (-), вам нужно будет добавить обратную косую черту впереди (\\) и (\ -) - первая обратная косая черта стоит как экранирующий символ. . Благодаря экранированию символа символы, имеющие особое значение, воспринимаются буквально.

Однако символы, не имеющие особого значения, например? _ + *. | () $ {}, Можно использовать напрямую.

Функция RegEx

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

findall()        Returns a list that contains all matches       
search()         Returns a 'match object' if there is a match in          the string
split()          Returns a list of string that has been split at each match
sub()            Replaces the matches with a string            

Во всех этих функциях аргументы одинаковые, это ‹pattern› и ‹string›.

Пример :

  1. найти все()
import re
pattern = r".at"
line = "The big fat cat sat on a cat"
result = re.findall(pattern, line)
print(result)

Выход :

['fat', 'cat', 'sat', 'cat']

2. поиск ()

import re
pattern = r".* .*"
line = "Ada Lovelace"
result = re.search(pattern, line)
print(result)
print(result.group())
print(result.group(0))

Выход :

<_sre.SRE_Match object; span=(0, 12), match='Ada Lovelace'>
Ada Lovelace
Ada Lovelace

3. split ()

import re
pattern = r"cat"
line = "The big fat cat sat on a cat"
result = re.split(pattern, line)
print(result)

Выход :

['The big fat ', ' sat on a ', '']

4. sub ()

import re
pattern = r"Ada"
line = "Ada Lovelace"
result = re.sub(pattern, r"Tom", line)
print(result)

Выход :

Tom Lovelace

Группа захвата регулярных выражений

Группа захвата очень полезна, когда мы хотим извлечь информацию из совпадения, как в нашем примере, log.txt.

Мы используем этот шаблон в log.txt: r ”\ (([\ d \ - +] +) \)”

Здесь мы используем группу захвата только для извлечения номера телефона без использования скобок.

Номер телефона, который мы хотим извлечь, можно получить с помощью result.group (1).

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

Пример :

  1. поиск()
import re
pattern = r"(.*) (.*)"
line = "Ada Lovelace"
result = re.search(pattern, line)
print(result)
print(result.groups())
print(result.group(0))
print(result.group(1))
print(result.group(2))

Выход :

<_sre.SRE_Match object; span=(0, 12), match='Ada Lovelace'>
('Ada', 'Lovelace')
Ada Lovelace
Ada
Lovelace

2. split ()

import re
pattern = r"(cat)"
line = "The big fat cat sat on a cat"
result = re.split(pattern, line)
print(result)

Выход :

['The big fat ', 'cat', ' sat on a ', 'cat', '']

3. sub ()

import re
pattern = r"(.*) (.*)"
line = "Ada Lovelace"
result1 = re.sub(pattern, r"\2 \1", line)
result2 = re.sub(pattern, r"Tom", line)
print(result1)
print(result2)

«\ 1» и «\ 2» обозначают первую и вторую группу захвата соответственно.

Выход :

Lovelace Ada
Tom

Последняя мысль…

RegEx станет мощным инструментом в вашем наборе инструментов программирования, особенно в Python. Возможно, вы уже поняли, что потенциал RegEx безграничен. Определенно стоит потратить время и поторопиться, чтобы изучить RegEx. Это окупится больше, чем вы думаете. Помнить :

Тяжелая работа вас никогда не разочарует. - анонимный

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



Не тратьте время зря. Готовьтесь и давайте покорим библиотеку RegEx!

С уважением,

Радиан Кришно