Регулярные выражения в Python - подробная инструкция по применению

Регулярные выражения в Python - подробная инструкция по применению
На чтение
24 мин.
Просмотров
24
Дата обновления
09.03.2025
Старт:21.10.2024
Срок обучения:9 мес.
Python-разработчик
Практический онлайн-курс, на котором вы с нуля изучите самый универсальный и востребованный язык программирования — Python. Создадите свое портфолио разработчика, которое выгодно покажет вас на рынке труда, и сможете зарабатывать в IT через полгода.
136 000 ₽340 000 ₽
11 333₽/мес рассрочка
Подробнее

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

import re

text = "Мой адрес - example@email.com, а еще один - anotheruser@domain.com и еще email@site.com."

pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"

matches = re.findall(pattern, text)

print(matches) # Выведет список адресов: ['example@email.com', 'anotheruser@domain.com', 'email@site.com']

Этот код находит все соответствия заданному шаблону (указывающему на формат адресов электронной почты) в тексте и сохраняет их в списке.

Ключевые моменты:

  • Шаблоны: Регулярные выражения – это шаблоны, описывающие искомую последовательность символов.

  • Модуль re: Для работы с регулярными выражениями в Python используется модуль re.

  • Метод re.findall(): Этот метод ищет все вхождения шаблона в тексте и возвращает список совпадений.

  • Символьные классы: Используйте [a-zA-Z0-9.] для поиска букв, цифр, точек и т.д.

  • Примеры: Вы можете проверить корректность телефонных номеров, парсить HTML-код, извлекать даты или любые другие данные, следуя шаблонам.

Подробные руководства по синтаксису и возможностям регулярных выражений Python вы найдете в документации.

Создание простых шаблонов поиска

Для поиска простых последовательностей символов используйте литералы. Например, шаблон "Python" найдёт строку "Python" в любом тексте.

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

Например, ".+" означает "любой символ, один или более раз". Это позволит найти строку вида "Python3", "Python2" - всё что угодно на месте цифры.

Чтобы найти последовательность чисел, используйте "\d+". Этот шаблон ищет одну или несколько цифр. Например, шаблон "\d{3}-\d{2}-\d{4}" найдёт даты в формате ДД-ММ-ГГГГ

Для поиска определённых символов (например, пробелов, переносов строк) используйте экранированные символы, такие как \s для любого пробельного символа, или для переноса строки.

Примеры:

  • "abc" – находит только "abc"
  • "\w+" – находит целую последовательность букв и цифр
  • "[aeiou]+" – находит одну или несколько гласных
  • ".*world.*" – находит любое слово в строке, содержащее "world"

Использование метасимволов и квантификаторов

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

Метасимволы – это специальные символы, которые определяют шаблоны поиска. Например:

  • . (точка) – любой одиночный символ, кроме новой строки.
  • \d – любая цифра от 0 до 9.
  • \w – любая буквенно-цифровая буква или знак подчеркивания.
  • \s – любой пробельный символ (пробел, табуляция, перенос строки).
  • [abc] – любой символ из списка 'a', 'b' или 'c'.
  • [^abc] – любой символ, кроме 'a', 'b' или 'c'.

Квантификаторы определяют количество повторений метасимволов или групп символов:

  • * – ноль или более повторений предыдущего символа или группы.
  • + – один или более повторений предыдущего символа или группы.
  • ? – ноль или один раз предыдущий символ или группа.
  • {n} – ровно n повторений предыдущего символа или группы.
  • {n,} – n или более повторений.
  • {n,m} – от n до m повторений.

Пример: Найдите все строки, содержащие 2-3 цифры, за которыми следует пробел и затем две буквы:

import re
text = "12 abc 345 def 6 ghi"
pattern = r"\d{2,3}\s\w{2}"
matches = re.findall(pattern, text)
print(matches)  # Выведет ['12 abc', '345 def']

Рекомендация: Изучите комбинации метасимволов и квантификаторов, чтобы создать мощные и гибкие паттерны. Используйте инструменты для тестирования регулярных выражений, чтобы отладить свои паттерны.

Обработка специальных символов и экранирование

Для корректной работы с регулярными выражениями, содержащими специальные символы (например, ".", "*", "+", "?", "(", ")", "[", "]", "{", "}" или "\"), необходимо использовать экранирование.

Экранирование достигается предваряя символ обратным слэшем (\).

  • \. – соответствует любой одному символу, кроме символа новой строки.
  • \* – соответствует нулю или более вхождений перед. символов, стоящих слева.
  • \+ – соответствует одному или более вхождений перед. символов, стоящих слева.
  • \? соответствует нулю или одному вхождению перед. символов, стоящих слева.
  • \( и \) – используются для создания подвыражений.
  • \[ и \] – используются для создания наборов символов.
  • \{ и \} – определяют количество вхождений.

Пример: Если нужно найти все строки, содержащие подстроку "abc.", то следует использовать регулярное выражение r"abc\. ", а не r"abc."

Ещё один пример: для поиска строки "123*", необходимо использовать r"123\* ", чтобы избежать неправильной интерпретации звёздочки.

  1. Экранирование обратного слэша: Чтобы найти символ обратного слеша, следует использовать \\ (два обратных слеша).
  2. Экранирование специальных символов в наборах: Если внутри набора символов [ ] требуется использовать символ, имеющий специальное значение в регулярных выражениях, то его следует экранировать.

Пример: Чтобы найти в строке символ "[", используйте r"\[" (обратите внимание на два обратных слэша, экранирующих открывающую квадратную скобку).

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

Использование групп захвата и обратных ссылок

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

Пример: Найдите все слова, начинающиеся с "тест":

pattern = r"\bтест\w+\b"

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

pattern = r"\b(тест\w+)\b"

Теперь первая найденная подстрока, соответствующая захвату, в переменной match.group(1). Для многократного поиска и извлечения, используйте цикл for.

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

pattern = r"(\w+),(\w+)"

Здесь (\w+) - группы захвата, соответствующие первому и второму слову. Чтобы найти все пары за один раз:

import re

text = "слово1,слово2;слово3,слово4"

matches = re.findall(pattern, text)

Используйте re.findall. Посмотрите на результат matches:

[('слово1', 'слово2'), ('слово3', 'слово4')]

Чтобы заменить часть строки, используя захваченные фрагменты, воспользуйтесь методом re.sub(pattern, repl, string, count=0, flags=0).

Пример: Замените все пары, используя обратные ссылки. Заменим запятую на тире:

pattern = r"(\w+),(\w+)"

repl = r"\1-\2"

Обратные ссылки \1 и \2 ссылаются на захваченные группы первого и второго слова. Результат:

re.sub(pattern, repl, text)

'слово1-слово2;слово3-слово4'

Применение функций `re` модуля для поиска и замены

Для поиска и замены по шаблонам в строках используйте функции re.findall, re.sub и re.subn.

  • re.findall(pattern, string): Возвращает список всех непересекающихся вхождений шаблона pattern в строке string.
    • Пример: re.findall(r'\d+', 'Текст 123 пример 456') вернёт ['123', '456'].
  • re.sub(pattern, repl, string): Заменяет все вхождения шаблона pattern в строке string на строку repl.
    • Пример: re.sub(r'\d+', 'число', 'Текст 123 пример 456') вернёт 'Текст число пример число'.
  • re.subn(pattern, repl, string): Аналогично re.sub, но возвращает кортеж (результат замены, количество замен).
    • Пример: Результат re.subn(r'\d+', 'число', 'Текст 123 пример 456') - ('Текст число пример число', 2).

Важные моменты:

  1. В качестве pattern указывается шаблон поиска. Используйте raw-строки (r'...') для работы с символами-разделителями.
  2. repl - строка для замены.
  3. string - исходная строка.
  4. При использовании специальных символов в шаблоне pattern (например, точка, звездочка), не забудьте использовать экранирование ( \. , \* ).

Более сложные примеры

  • Замена всех слов, содержащих "abc" на "xyz": re.sub(r'\b(abc)\b', 'xyz', 'word-abc-another-word') вернёт ‘word-xyz-another-word’
  • Замена всех чисел, разделённых пробелами, на «число»: re.sub(r'\b\d+\b', 'число', '123 456 789') вернёт 'число число число'

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

Обработка результатов поиска

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

Метод Описание Пример
re.findall(pattern, string) Возвращает список всех неперекрывающихся подстрок, соответствующих шаблону. re.findall(r'\d+', 'Текст содержит 123 числа и 456') вернёт ['123', '456']
re.finditer(pattern, string) Возвращает итератор, позволяющий получить объекты Match для каждого совпадения. for match in re.finditer(r'\w+', 'Текст'): print(match.group(0))
Обрабатывает слова по отдельности.
match.group(0) Возвращает полное совпадение. match.group(0) вернёт текст, с которым совпал шаблон.
match.group(N) Возвращает содержимое группы, заданной номером
N
.
Создавая с помощью скобок в регулярном выражении группы, можно выделить нужные куски записи (e.g.,
re.search(r'(?P\w+)', 'ИМЯ Джон Доу')
).
match.start(), match.end(), match.span() Возвращают индексы начала и конца совпадения в исходной строке. match.start() вернёт позицию начала совпадения, match.end() - позицию конца. match.span() - кортеж из двух значений.

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

Вопрос-ответ:

Какие символы-модификаторы используются в регулярных выражениях и для чего они служат?

В регулярных выражениях существуют специальные символы-модификаторы, позволяющие указать различные условия поиска. Например, `.` соответствует любому символу, `*` — нулю или более повторений предыдущего элемента. `+` — одному или более повторений, и т.д. `^` и `$` соответствуют началу и концу строки соответственно. `\d` соответствует любой цифре, а `\w` соответствует букве, цифре или символу подчеркивания. Подробную информацию о каждом символе-модификаторе, его функциональности и использовании можно найти в документации Python re module.

0 Комментариев
Комментариев на модерации: 0
Оставьте комментарий

Курсы