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

Для поиска и обработки текста в 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\* ", чтобы избежать неправильной интерпретации звёздочки.
- Экранирование обратного слэша: Чтобы найти символ обратного слеша, следует использовать \\ (два обратных слеша).
- Экранирование специальных символов в наборах: Если внутри набора символов [ ] требуется использовать символ, имеющий специальное значение в регулярных выражениях, то его следует экранировать.
Пример: Чтобы найти в строке символ "[", используйте 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).
Важные моменты:
- В качестве
pattern
указывается шаблон поиска. Используйте raw-строки (r'...') для работы с символами-разделителями. repl
- строка для замены.string
- исходная строка.- При использовании специальных символов в шаблоне
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). |
match.start() , match.end() , match.span() |
Возвращают индексы начала и конца совпадения в исходной строке. | match.start() вернёт позицию начала совпадения, match.end() - позицию конца. match.span() - кортеж из двух значений. |
Важно: Для эффективной обработки результатов используйте итераторы, где это возможно. Избегайте создания больших списков совпадений, чтобы не употреблять избыточной памяти.
Вопрос-ответ:
Какие символы-модификаторы используются в регулярных выражениях и для чего они служат?
В регулярных выражениях существуют специальные символы-модификаторы, позволяющие указать различные условия поиска. Например, `.` соответствует любому символу, `*` — нулю или более повторений предыдущего элемента. `+` — одному или более повторений, и т.д. `^` и `$` соответствуют началу и концу строки соответственно. `\d` соответствует любой цифре, а `\w` соответствует букве, цифре или символу подчеркивания. Подробную информацию о каждом символе-модификаторе, его функциональности и использовании можно найти в документации Python re module.
Курсы
.png)

.png)

.png)

.png)
