Модуль 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。

Пример

import re

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()не требует, чтобы совпадение начиналось с начала строки.

Пример

import re

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()Функция используется для поиска всех подстрок в строке, соответствующих регулярному выражению, и возвращает список.

Пример

import re

pattern = r"\d+"
text = "Есть 3 яблока и 5 апельсинов."

matches = re.findall(pattern, text)
print("Найденные числа:", matches)

Вывод:

找到的数字: ['3', '5']

2.4 re.sub()

re.sub()Функция используется для замены частей строки, соответствующих регулярному выражению.

Пример

import re

pattern = r"яблоко"
text = "У меня есть яблоко."

new_text = re.sub(pattern, "банан", text)
print("Заменённый текст:", new_text)

Вывод:

替换后的文本: I have an banana.

Базовый синтаксис регулярных выражений

1. Обычные символы

Обычные символы (например, буквы, цифры) совпадают сами с собой напрямую.

Пример

import re

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_])。

Пример

import re

pattern = r"\d+"
текст = "Цена — 100 долларов."

match = re.search(pattern, text)
if match:
    print("Match successful:", match.group())

Вывод:

匹配成功: 100

3. Наборы символов

Наборы символов используются для сопоставления с любым одним символом из набора. Например,[abc]matchesa、bилиc。

Пример

import re

шаблон = r"[aeiou]"
text = "Привет, мир!"

matches = re.findall(pattern, text)
print("Найдено гласных:", matches)

Вывод:

找到的元音字母: ['e', 'o', 'o']

4. Группировка

Группировка позволяет объединять несколько символов вместе и работать с ними. Например,(abc)matchesabc。

Пример

import re

pattern = r"(ab)+"
text = "ababab"

match = re.search(pattern, text)
if match:
    print("Match successful:", match.group())

Вывод:

匹配成功: ababab

Практические упражнения

Упражнение 1: Проверка адресов электронной почты

Напишите регулярное выражение для проверки формата адреса электронной почты.

Пример

import re

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: Извлечение номеров телефонов

Напишите регулярное выражение для извлечения номеров телефонов из текста.

Пример

import re

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. Извлечение адресов электронной почты

Пример

import re

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. Заменить форматы дат

Пример

date_str = "Сегодня 05-15-2023"
new_str = re.sub(r'(\d{2})-(\d{2})-(\d{4})', r'\3year\1month\2day', date_str)
print(new_str)  # Вывод: "Сегодня 2023-05-15"

3. Сопоставление по нескольким условиям

Пример

pattern = re.compile(r'''
    ^(?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. Разделение сложных строк

Пример

text = "Apple1Banana2Cherry3Date"
parts = re.split(r'\d+', text)
print(parts)  # Вывод: ['Apple', 'Banana', 'Cherry', 'Date']

Примечания

  1. Сырые строки: Для регулярных выражений рекомендуется использовать сырые строки (r'\d'), чтобы избежать конфликтов экранирующих символов.

  2. Жадное сопоставление: Жадное сопоставление по умолчанию (например,.*будет соответствовать самой длинной из возможных), нужно использовать.*?для реализации нежадного сопоставления.

  3. Оптимизация производительности: часто используемые регулярные выражения должны в первую очередь использоватьre.compile()предкомпиляцию.

  4. Проблемы с бэктрекингом: сложные регулярные выражения могут вызывать проблемы с производительностью (например, вложенные квантификаторы(a+)+)。

Другие расширения