Метод Python re.compile()
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: Базовое использование - Компиляция регулярного выражения
Пример
# Компиляция регулярного выражения
pattern = re.compile(r'\d+')
# Использовать скомпилированный объект для сопоставления
text = "У меня есть 3 яблока и 5 апельсинов"
result = pattern.findall(text)
print("Найденные числа:", result)
Ожидаемый вывод:
找到的数字: ['3', '5']
Пояснение к коду:
re.compile(r'\d+')Скомпилируйте регулярное выражение, соответствующее одной или нескольким цифрам.- Объект, возвращаемый после компиляции
patternhasfindall()、search()、match()методы, такие как match(), search(), findall() и т. д. - Использование скомпилированного объекта для сопоставления более эффективно.
Пример 2: Повторное использование одного и того же шаблона несколько раз
Самое большое преимущество компиляции регулярного выражения состоит в том, что его можно использовать повторно, избегая повторного разбора.
Пример
# Скомпилируйте регулярное выражение для сопоставления адресов электронной почты
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: Использование флагов
Вы можете указать флаги регулярного выражения во время компиляции, чтобы изменить поведение сопоставления.
Пример
# Укажите флаг игнорирования регистра при компиляции
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: Использование групп
Скомпилированный объект может использовать группы для извлечения определённого содержимого.
Пример
# Компилируем регулярное выражение с использованием групп
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: Свойства скомпилированного объекта
Скомпилированный объект регулярного выражения имеет несколько полезных свойств.
Пример
# Компиляция регулярного выражения
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
Пример
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()чтобы скомпилировать его заранее.
Другие расширения
Модуль re в Python