Метод Python re.compile()

Python re 模块Модуль re в Python


re.compile()является Pythonreфункцией модуля, используемой длякомпиляции регулярных выражений.

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

Определение слова: compileЭто означает compile.


Базовый синтаксис и параметры

re.compile()Используется для создания скомпилированного объекта регулярного выражения.

Формат синтаксиса

re.compile(pattern, flags=0)

Описание параметра

  • pattern:
    • Тип: строка (str)
    • Описание: шаблон регулярного выражения для компиляции.
  • флаги:
    • Тип: целое число (int, необязательно)
    • Описание: флаги регулярного выражения, такие какre.IGNORECASE、re.MULTILINEи т. д. Вы можете использовать|для объединения нескольких флагов.

Описание функций

  • Возвращаемое значение: Возвращает скомпилированный объект регулярного выражения (re.Patternобъект).
  • Особенности: Скомпилированный объект можно использовать повторно; по сравнению с вызовомre.search()функций, таких как re.match(), каждый раз и повторным разбором регулярного выражения, это более эффективно.

Примеры

Давайте подробно разберём на серии примеров от простого к сложному,re.compile()использование re.compile().

Пример 1: Базовое использование - Компиляция регулярного выражения

Пример

import re

# Компиляция регулярного выражения
pattern = re.compile(r'\d+')

# Использовать скомпилированный объект для сопоставления
text = "У меня есть 3 яблока и 5 апельсинов"

result = pattern.findall(text)

print("Найденные числа:", result)

Ожидаемый вывод:

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

Пояснение к коду:

  1. re.compile(r'\d+')Скомпилируйте регулярное выражение, соответствующее одной или нескольким цифрам.
  2. Объект, возвращаемый после компиляцииpatternhasfindall()、search()、match()методы, такие как match(), search(), findall() и т. д.
  3. Использование скомпилированного объекта для сопоставления более эффективно.

Пример 2: Повторное использование одного и того же шаблона несколько раз

Самое большое преимущество компиляции регулярного выражения состоит в том, что его можно использовать повторно, избегая повторного разбора.

Пример

import re

# Скомпилируйте регулярное выражение для сопоставления адресов электронной почты
email_pattern = re.compile(r'\w+@\w+\.\w+')

# Используйте его повторно для нескольких текстов
texts = [
    "Обратитесь к [email protected] за помощью",
    "Электронная почта: [email protected]",
    "Отправитель: [email protected]"
]

for text in texts:
    result = email_pattern.search(text)
    if result:
        print(f"Найден email: {result.group()}")

Ожидаемый вывод:

找到邮箱: [email protected]
找到邮箱: [email protected]
找到邮箱: [email protected]

Пояснение к коду:

  • Скомпилируйте регулярное выражение только один раз, затем повторно используйте его для нескольких текстов.
  • Скомпилированный объект может вызыватьsearch()、findall()методы, такие как search(), несколько раз.

Пример 3: Использование флагов

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

Пример

import re

# Укажите флаг игнорирования регистра при компиляции
pattern = re.compile(r'python', re.IGNORECASE)

text = "Python is great, PYTHON is powerful"

# Используйте скомпилированный объект для поиска
result = pattern.findall(text)

print("Найдено:", result)

Ожидаемый вывод:

找到: ['Python', 'PYTHON']

Пояснение к коду:

  • re.IGNORECASEДелает сопоставление нечувствительным к регистру.
  • Указание флагов во время компиляции применяет их ко всем операциям, использующим этот объект.

Пример 4: Использование групп

Скомпилированный объект может использовать группы для извлечения определённого содержимого.

Пример

import re

# Компилируем регулярное выражение с использованием групп
pattern = re.compile(r'(\d{3})-(\d{4})-(\d{4})')

text = "Чжан Сан: 138-1234-5678, Ли Сы: 139-9876-5432"

# Найти все совпадения
results = pattern.findall(text)

for result in results:
    print(f"Полное: {result)
    print(f" Группа 1 (первые 3 цифры): {result)
    print(f" Группа 2 (средние 4 цифры): {result)
    print(f" Группа 3 (последние 4 цифры): {result)

Ожидаемый вывод:

完整: 138-1234-5678
  第1组(前3位): 138
  第2组(中间4位): 1234
  第3组(后4位): 5678
完整: 139-9876-5432
  第1组(前3位): 139
  第2组(中间4位): 9876
  第3组(后4位): 5432

Пояснение к коду:

  • Круглые скобки()создайте три группы.
  • findall()Возвращает список кортежей, каждый из которых содержит содержимое групп.

Пример 5: Свойства скомпилированного объекта

Скомпилированный объект регулярного выражения имеет несколько полезных свойств.

Пример

import re

# Компиляция регулярного выражения
pattern = re.compile(r'\d+', re.IGNORECASE | re.MULTILINE)

print("Шаблон:", pattern.pattern)
print("Флаги:", pattern.flags)
print("Количество групп:", pattern.groups)
print("Имена групп:", pattern.groupindex)

Ожидаемый вывод:

模式: \d+
标志: 50
分组数: 1
分组名: {}

Пояснение к коду:

  • pattern.pattern- Возвращает исходную строку шаблона.
  • pattern.flags- Возвращает целочисленное значение флагов.
  • pattern.groups- Возвращает количество групп.
  • pattern.groupindex- Возвращает словарь именованных групп.

Пример 6: Сравнение с функциями модуля re

Пример

import re

text = "ABC123DEF"

# Способ 1: напрямую использовать функции модуля re
result1 = re.search(r'\d+', text)

# Способ 2: сначала скомпилировать, затем использовать скомпилированный объект
pattern = re.compile(r'\d+')
result2 = pattern.search(text)

print("re.search():", result1.group())
print("pattern.search():", result2.group())

# Оба метода дают одинаковый результат, но скомпилированный объект можно использовать повторно

Ожидаемый вывод:

re.search(): 123
pattern.search(): 123

Пояснение к коду:

  • Результаты обоих методов одинаковы.
  • Когда вам нужно использовать один и тот же шаблон несколько раз, рекомендуется использоватьre.compile()чтобы скомпилировать его заранее.

Python re 模块Модуль re в Python

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