Регулярные выражения, сокращенно RegEx, можно использовать в Python после импорта встроенного пакета «re» для поиска определенных шаблонов в символьных строках.
Что такое Python RegEx?
RegEx — это так называемые регулярные выражения. Это строки символов, определяющие определенные шаблоны поиска. Их можно использовать для проверки строк Python на наличие этих шаблонов поиска. Python RegEx следует своему собственному синтаксису и семантике.
Области применения Python RegEx
Регулярные выражения часто используются для проверки ввода пользователей программы для определенного формата.
Известный и наверняка знакомый пример — создание пароля, который должен содержать хотя бы одну заглавную букву и хотя бы одну цифру. Python RegEx теперь можно использовать для проверки ввода на соответствие этим правилам.
Регулярные выражения также часто используются при заполнении веб-форм для проверки правильности ввода пользователя. Например, можно оценить, действительно ли введенный адрес электронной почты является адресом электронной почты в допустимом формате.
Синтаксис и семантика Python RegEx
В регулярных выражениях используются так называемые метасимволы. Это символы, которые имеют определенное значение в Python RegEx. Наиболее важные метасимволы, включая их значение и пример, можно найти в следующей обзорной таблице:
| Знак | Описание | Пример |
| . | Соответствует любому символу, кроме новой строки | ha..o -> находит все строки, заканчивающиеся на «ha», за которыми следуют любые два символа, за которыми следует «o», например. например «привет» |
| [] | Соответствует всем буквам, указанным в скобках | [ae] -> находит все строчные буквы между a и e |
| ^ | Проверяет, начинается ли строка с указанного символа или указанной строки символов | ^hello -> проверяет, начинается ли строка с «hello». |
| $ | Проверяет, заканчивается ли строка указанным символом или указанной строкой символов | $world -> проверяет, заканчивается ли строка на «мир». |
| * | Ноль или более вхождений символа | a* -> соответствует либо любому количеству a, либо вообще ни одному |
| + | Одно или несколько вхождений символа | a+ -> соответствует хотя бы одному вхождению a |
| ? | Одно или ни одного появления символа | а? -> соответствует ровно одному или не соответствует a |
| {} | Проверяет, встречается ли символ ровно столько раз, сколько указано в фигурных скобках | hal{2}o -> соответствует строке «hello» |
Так называемые наборы особенно важны для большинства регулярных выражений Python и поэтому заслуживают более пристального внимания. Наборы — это шаблоны RegEx, которые начинаются и заканчиваются квадратной скобкой. Вы уже видели пример набора, который находит все строчные буквы между a и e в обзорной таблице выше. Ниже приведен обзор часто используемых наборов в Python RegEx:
sets
| набор | Описание |
| [Азбука] | Соответствует, если один из символов, указанных в скобках (например, a, b или c), встречается в строке символов. |
| [^абв] | Соответствует любому символу, не указанному в скобках |
| [аз] | Соответствует всем строчным буквам между a и z |
| [а-я-я] | Соответствует всем буквам между a и z, независимо от того, являются ли они прописными или строчными. |
| [0-9] | Соответствует любому числу от 0 до 9 |
| [1-5][0-9] | Соответствует любому двузначному числу от 10 до 59. |
Как видите, множества — это мощный инструмент для различных регулярных выражений. Однако при использовании наборов следует отметить, что метасимволы, представленные выше в квадратных скобках, не имеют конкретного значения. Таким образом, набор [*] будет соответствовать всем * в данной строке.
sequences
В дополнение к представленным метасимволам вы можете использовать специальные и уже предопределенные последовательности в Python RegEx для создания точных шаблонов поиска.
| последовательность | Описание | Пример |
| \А | Соответствует, если указанная строка символов находится в начале строки | \AMontag — Соответствует фразе «Понедельник — отличный день». — Не соответствует фразе «Сегодня понедельник». |
| \б | Соответствует, если указанная строка находится в начале или в конце слова | \bes- Совпадения для «Идет дождь в понедельник». — Совпадения для «есть» — Не подходит для «ужин»»es\b» — Совпадения для «Правда» — Совпадения для «Храбрый ребенок» — Не подходит для » Отдых» |
| \В | Соответствует, если указанная строка не найдена в начале или в конце слова; напротив \b | \Bes- Не подходит для «Идет дождь в понедельник».- Не подходит для «есть»- Подходит для «ужин»»es\B»- Не подходит для «Правда»- Не подходит для «Храбрый ребенок» — Спички на «Отдых» |
| \ д | Соответствует любой цифре от 0 до 9; Эквивалент [0-9] | 123- \d находит три совпадения для 1, 2 и 3 |
| \Д | Соответствует любому нецифровому символу; Эквивалентно [^0-9] | 123acb&- \D находит четыре совпадения для a, c, b и & |
| \с | Соответствует, если строка содержит пробел | Регулярное выражение Python \s совпадает, потому что есть пробел |
| \С | Соответствует, если строка не содержит пробелов; Напротив \s | Регулярное выражение Python \S не соответствует, потому что есть пробел |
| \w | Соответствует всем буквенно-цифровым символам | 1abc$%3- \w находит четыре совпадения для 1, a, b, c и 3 |
| \ W | Соответствует любому символу, кроме буквенно-цифровых; напротив \w | 1abc$%3- \W находит два совпадения для $ и % |
| \Z | Соответствует, если указанная строка символов находится в конце строки | Python\Z — соответствует «RegEx в Python» — не соответствует «Python RegEx» |
Функции для использования Python RegEx
Если вы хотите использовать RegEx в Python, вам поможет ряд предопределенных функций. Все эти функции находятся в модуле Python с именем re, поэтому вам нужно сначала импортировать его при работе с регулярными выражениями:
import re
re.findall()
Вероятно, наиболее важной функцией при работе с Python RegEx является функция findall(). Он принимает шаблон поиска и строку Python и возвращает вам список строк Python, содержащий все совпадения в том порядке, в котором они были найдены. Если совпадений не найдено, вызов findall() возвращает пустой список.
Пример кода помогает проиллюстрировать функцию:
import re string = "python 3.0" regex = "\D" ergebnis = re.findall(regex, string) print(ergebnis)
В приведенном выше фрагменте кода сначала импортируется модуль re, как показано. Затем строка символов «python 3.0» сохраняется в переменной с именем «string». Шаблон поиска, хранящийся в переменной с именем «regex», уже известен вам из таблицы последовательностей и соответствует всем символам, не являющимся цифрами. Это сопоставление реализовано с помощью функции findall(), которая принимает шаблон поиска и проверяемую строку символов в качестве параметров передачи. Список, возвращаемый функцией, хранится в переменной с именем «result» и отображается на экране при вызове Python print. Вывод выглядит следующим образом:
Список включает все символы строки, кроме цифр. Следует отметить, что символ пробела также считается отдельным символом и поэтому появляется в списке.
re.sub()
С помощью функции sub() все совпадения заменяются текстом по вашему выбору. Как и findall(), функция также принимает регулярное выражение в качестве первого передаваемого параметра. Вы должны передать текст, которым вы хотите заменить совпадения, в качестве второго параметра передачи. Третий передаточный параметр функции — искомая строка. Если вы хотите перезаписать не все, а только определенное количество спичек, то в качестве четвертого параметра переноса можно указать число, которое указывает, сколько спичек подлежит замене, начиная с первой спички.
Здесь также пример кода помогает визуализировать, как это работает:
import re string = "python ist eine tolle programmiersprache" regex = "\s" ergebnis1 = re.sub(regex, "0", string) print(ergebnis1) ergebnis2 = re.sub(regex, "0", string, 2) print(ergebnis2)
Опять же, сначала повторно импортируется, а затем строка символов сохраняется в переменной «string». Вы также уже знаете применяемый шаблон поиска: он соответствует всем пробелам в строке.
Затем следуют два похожих вызова sub(): первый вызов функции должен заменить все пробелы в переданной строке на 0 и сохранить результат в переменной «result1». Второй вызов функции ограничивает количество пробелов с помощью необязательного четвертого параметра передачи. Поэтому он должен заменить первые два пробела в переданной строке на 0, а затем сохранить результат в переменной «result2».
Таким образом, вывод приведенного выше кода выглядит следующим образом:
re.split()
Способ работы функции split() из модуля re, как следует из названия, напоминает встроенную функцию Python split(). Он также разбивает строку на список. Строка символов разбивается регулярным выражением после каждого совпадения. Поэтому неудивительно, что функция ожидает в качестве первого параметра шаблон поиска, а в качестве второго параметра — разбиение строки. Если вы хотите разделить строку только ограниченное количество раз, вы можете передать число в качестве третьего и необязательного параметра. Это затем определяет максимальное количество разделений. Другой пример поможет:
Большая часть кода вам уже знакома по предыдущему примеру. Изменился только вызов функции split(). Во-первых, функция split() вызывается для строки и должна разбивать ее для каждого вхождения пробела. Полученный список присваивается переменной «result1». Второй вызов split() ограничивает количество разделений до 1, указывая необязательный третий параметр и присваивая результат переменной с именем «result2». Когда программа запускается, она возвращает следующий результат:
re.search()
Как следует из названия, функция search() ищет совпадение в строке. Для этого он сначала принимает регулярное выражение, а в качестве второго параметра — проверяемую строку. Он возвращает объект соответствия Python, который всегда ссылается на первое найденное совпадение. Если совпадений не найдено, функция возвращает None. Пример помогает понять, как работает функция:
import re string = "python ist eine tolle programmiersprache" regex = "\s" match = re.search(regex, string) if match: print("RegEx wurde gefunden.") else: print("RegEx wurde nicht gefunden.")
Функция search() вызывается с регулярным выражением, которое ищет пробелы и строку. Объект Match, возвращаемый вызовом функции, сохраняется в переменной с именем «match». Следующая инструкция Python if-else предназначена для иллюстративных целей: если совпадение найдено, объект совпадения не пуст и выбран путь if. Неудивительно, что программа выдает следующий результат:
Объект соответствия
Объект Match возвращается из вызова search() и содержит информацию о совпадающих экземплярах шаблона поиска. Вы можете получить доступ к этой информации с помощью различных функций:
- object.start() дает вам индекс первого символа подстроки Python, который соответствует вашему шаблону поиска.
- object.end() возвращает индекс последнего символа, аналогично start().
- object.span() объединяет start() и end(): функция возвращает кортеж Python, содержащий первый и последний индекс подстроки.
- object.string возвращает проверенную вами строку.
- object.re возвращает регулярное выражение Python, которое вы передали в search().
Все эти функции можно визуализировать, добавив соответствующие вызовы функций в последний пример кода:
import re string = "python ist eine tolle programmiersprache" regex = "\s" match = re.search(regex, string) if match: print("RegEx wurde gefunden.") else: print("RegEx wurde nicht gefunden.") print(match.start()) print(match.end()) print(match.span()) print(match.string) print(match.re())
Вывод программы выглядит так:
Во-первых, выводится строка «RegEx was found.», так как объект соответствия не пуст и, следовательно, применяется условие if. Затем отображается индекс первого совпадения. Поскольку первый пробел имеет индекс «6», значение неудивительно. То же самое относится и к значению «7», возвращаемому в результате вызова функции end(). Кортеж «(6, 7)» объединяет вызовы start() и end(), указывая сразу оба индекса. Строка, переданная объекту соответствия, также неудивительна в своем выводе.
Но как насчет вывода «re.compile(’\\s’)»? Это объект Python RegEx. Это происходит, когда строка, которую вы передали как регулярное выражение, обрабатывается как таковая. Как видите, вы можете просматривать объект RegEx через свой объект Match.








