Модуль re в Python
Pythonreмодуль — это модуль стандартной библиотеки для работы с регулярными выражениями.
Регулярные выражения (Regular Expression, сокращённо regex или regexp) — мощный инструмент для сопоставления, поиска и обработки текста.
Используяreмодуль, вы можете использовать регулярные выражения в Python для обработки строк.
Зачем использовать модуль re?
При обработке текста нам часто нужно находить определённые шаблоны или заменять определённые символы. Например, проверять адреса электронной почты, извлекать ссылки с веб-страниц или форматировать текст. Писать код вручную для выполнения этих задач может быть очень утомительно, тогда как регулярные выражения предоставляют краткий и эффективный способ решения этих проблем.
Базовое использование модуля re
1. Импорт модуля re
Перед использованиемreмодуль, сначала нужно импортировать его:
import re
2. Часто используемые функции модуля re
2.1 re.match()
re.match()Функция используется для сопоставления регулярного выражения с началом строки. Если сопоставление успешно, она возвращает объект совпадения; в противном случае она возвращаетNone。
Пример
pattern = r"hello"
text = "hello world"
match = re.match(pattern, text)
if match:
print("Match successful:", match.group())
else:
print("Match failed")
Вывод:
匹配成功: hello
2.2 re.search()
re.search()Функция используется для поиска первого совпадения регулярного выражения в строке. В отличие отre.match()отличается,re.search()не требует, чтобы совпадение начиналось с начала строки.
Пример
pattern = r"world"
text = "hello world"
match = re.search(pattern, text)
if match:
print("Match successful:", match.group())
else:
print("Match failed")
Вывод:
匹配成功: world
2.3 re.findall()
re.findall()Функция используется для поиска всех подстрок в строке, соответствующих регулярному выражению, и возвращает список.
Пример
pattern = r"\d+"
text = "Есть 3 яблока и 5 апельсинов."
matches = re.findall(pattern, text)
print("Найденные числа:", matches)
Вывод:
找到的数字: ['3', '5']
2.4 re.sub()
re.sub()Функция используется для замены частей строки, соответствующих регулярному выражению.
Пример
pattern = r"яблоко"
text = "У меня есть яблоко."
new_text = re.sub(pattern, "банан", text)
print("Заменённый текст:", new_text)
Вывод:
替换后的文本: I have an banana.
Базовый синтаксис регулярных выражений
1. Обычные символы
Обычные символы (например, буквы, цифры) совпадают сами с собой напрямую.
Пример
pattern = r"кот"
text = "На коврике сидит кот."
match = re.search(pattern, text)
if match:
print("Match successful:", match.group())
Вывод:
匹配成功: cat
2. Специальные символы
В регулярных выражениях есть некоторые специальные символы, имеющие особое значение. Например:
.: Соответствует любому одиночному символу (кроме символа новой строки).*: Соответствует предыдущему символу ноль или более раз.+: Соответствует предыдущему символу один или более раз.?: Соответствует предыдущему символу ноль или один раз.\d: Соответствует любому цифровому символу (эквивалентно[0-9])。\w: Соответствует любой букве, цифре или символу подчёркивания (эквивалентно[a-zA-Z0-9_])。
Пример
pattern = r"\d+"
текст = "Цена — 100 долларов."
match = re.search(pattern, text)
if match:
print("Match successful:", match.group())
Вывод:
匹配成功: 100
3. Наборы символов
Наборы символов используются для сопоставления с любым одним символом из набора. Например,[abc]matchesa、bилиc。
Пример
шаблон = r"[aeiou]"
text = "Привет, мир!"
matches = re.findall(pattern, text)
print("Найдено гласных:", matches)
Вывод:
找到的元音字母: ['e', 'o', 'o']
4. Группировка
Группировка позволяет объединять несколько символов вместе и работать с ними. Например,(abc)matchesabc。
Пример
pattern = r"(ab)+"
text = "ababab"
match = re.search(pattern, text)
if match:
print("Match successful:", match.group())
Вывод:
匹配成功: ababab
Практические упражнения
Упражнение 1: Проверка адресов электронной почты
Напишите регулярное выражение для проверки формата адреса электронной почты.
Пример
pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
email = "[email protected]"
if re.match(pattern, email):
print("Корректный адрес электронной почты")
else:
print("Некорректный адрес электронной почты")
Упражнение 2: Извлечение номеров телефонов
Напишите регулярное выражение для извлечения номеров телефонов из текста.
Пример
pattern = r"\d{3}-\d{3}-\d{4}"
text = "Мой номер телефона: 123-456-7890."
match = re.search(pattern, text)
if match:
print("Найденные номера телефонов:", match.group())
1. Основные функции
| Метод | Описание | Пример |
|---|---|---|
re.compile(pattern) |
Предварительно скомпилировать регулярное выражение (повышает производительность при повторном использовании) | pat = re.compile(r'\d+') |
re.search(pattern, string) |
Найти первое совпадение в строке | re.search(r'\d+', 'a1b2')→ совпадения'1' |
re.match(pattern, string) |
Совпадение с начала строки | re.match(r'\d+', '123a')→ совпадения'123' |
re.fullmatch(pattern, string) |
Вся строка полностью совпадает | re.fullmatch(r'\d+', '123')→ совпадения'123' |
re.findall(pattern, string) |
Вернуть список всех непересекающихся совпадений | re.findall(r'\d+', 'a1b22c') → ['1', '22'] |
re.finditer(pattern, string) |
Вернуть итератор всех совпадений (включая информацию о позиции) | for m in re.finditer(r'\d+', 'a1b2'): print(m.group()) |
re.sub(pattern, repl, string) |
Заменить совпадения | re.sub(r'\d+', 'X', 'a1b2') → 'aXbX' |
re.split(pattern, string) |
Разделить строку по совпадениям | re.split(r'\d+', 'a1b2c') → ['a', 'b', 'c'] |
re.escape() |
Экранировать специальные символы | re.escape("C:\\Users\\test.txt")
|
re.purge() |
Очистить кэш | re.purge()
|
2. Объект совпадения (Match) методы/атрибуты
| Метод/атрибут | Описание | Пример |
|---|---|---|
group() |
Возвращает всю совпавшую строку | m.group() → 'abc' |
group(n) |
Возвращает содержимое n-й группы захвата | m = re.search(r'(\d)(\d)', '12'); m.group(1) → '1' |
groups() |
Возвращает кортеж всех групп захвата | m.groups() → ('1', '2') |
start()/end() |
Начальная/конечная позиция совпадения | m.start() → 0 |
span() |
Возвращает диапазон совпадения(start, end) |
m.span() → (0, 2) |
3. Метасимволы регулярных выражений (частично)
| Метасимвол | Описание | Пример совпадения |
|---|---|---|
. |
Соответствует любому символу (кроме новой строки) | a.c → 'abc' |
\d |
Совпадение с цифрой | \d+ → '123' |
\D |
Совпадение с нецифровым символом | \D+ → 'abc' |
\w |
Совпадение с символом слова (буква, цифра, подчёркивание) | \w+ → 'Ab_1' |
\W |
Совпадение с символом, не входящим в слово | \W+ → '!@#' |
\s |
Совпадение с пробельным символом (пробел, табуляция и т. д.) | \s+ → ' \t' |
\S |
Совпадение с непробельным символом | \S+ → 'abc' |
[] |
Набор символов | [A-Za-z]→ любая буква |
^ |
Совпадение с началом строки | ^\d+→ цифра в начале |
$ |
Совпадение с концом строки | \d+$→ цифра в конце |
* |
Совпадение с предшествующим символом ноль или более раз | a* → '', 'aaa' |
+ |
Совпадение с предыдущим символом один или более раз | a+ → 'a', 'aaa' |
? |
Совпадение с предыдущим символом ноль или один раз | a? → '', 'a' |
{m,n} |
Совпадение с предыдущим символом от m до n раз | a{2,3} → 'aa', 'aaa' |
| |
Операция OR | cat|dog → 'cat'или'dog' |
() |
Захватывающая группа | (\d+)→ извлечь цифры |
4. Флаги компиляции (flagsпараметр)
| Флаг | Описание | Пример |
|---|---|---|
re.IGNORECASE (re.I) |
Игнорировать регистр | re.search(r'abc', 'ABC', re.I) |
re.MULTILINE (re.M) |
Многострочный режим (влияет^и$) |
re.findall(r'^\d+', '1\n2', re.M) → ['1', '2'] |
re.DOTALL (re.S) |
Пусть.Совпадение всех символов, включая переводы строк |
re.search(r'a.*b', 'a\nb', re.S) |
re.ASCII |
Пусть\w, \Wи т.д. соответствуют только ASCII-символам |
re.search(r'\w+', 'こん', re.ASCII)→ нет совпадений |
re.VERBOSE (re.X) |
Разрешить комментарии и пробелы в регулярном выражении | re.compile(r'''\d+ # 匹配数字''', re.X) |
Пример
1. Извлечение адресов электронной почты
Пример
text = "Контакт: [email protected], [email protected]"
emails = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', text)
print(emails) # Вывод: ['[email protected]', '[email protected]']
2. Заменить форматы дат
Пример
new_str = re.sub(r'(\d{2})-(\d{2})-(\d{4})', r'\3year\1month\2day', date_str)
print(new_str) # Вывод: "Сегодня 2023-05-15"
3. Сопоставление по нескольким условиям
Пример
^(?P<username>\w+) # имя пользователя
:(?P<password>\S+) # пароль
@(?P<domain>\w+\.\w+) # домен
$''', re.VERBOSE)
m = pattern.match("john:[email protected]")
if m:
print(m.groupdict()) # Вывод: {'username': 'john', 'password': 'pass123', 'domain': 'example.com'}
4. Разделение сложных строк
Пример
parts = re.split(r'\d+', text)
print(parts) # Вывод: ['Apple', 'Banana', 'Cherry', 'Date']
Примечания
-
Сырые строки: Для регулярных выражений рекомендуется использовать сырые строки (
r'\d'), чтобы избежать конфликтов экранирующих символов. -
Жадное сопоставление: Жадное сопоставление по умолчанию (например,
.*будет соответствовать самой длинной из возможных), нужно использовать.*?для реализации нежадного сопоставления. -
Оптимизация производительности: часто используемые регулярные выражения должны в первую очередь использовать
re.compile()предкомпиляцию. -
Проблемы с бэктрекингом: сложные регулярные выражения могут вызывать проблемы с производительностью (например, вложенные квантификаторы
(a+)+)。