Добавить в корзинуПозвонить
Найти в Дзене

Питон 3.14 и регулярки: что реально изменилось

Каждый раз когда выходит новая версия Питона: часть разработчиков её игнорирует. Мол, регулярки работают, зачем трогать. Понять можно. Но в 3.14 изменения попали именно в ту часть которую все считали "и так нормальной".

Сразу отмечу: это не революция. Хотя нет, точнее так: это накопленные улучшения которые вместе дают реальный эффект. Не маркетинговый, а измеримый.
Кэш стал умнее - и это не просто слова

Смотрите вначале когда вы компилируете паттерн через re.compile(): движок сохраняет результат в кэш. Это было и раньше. Но в 3.14 кэш начал умнее управлять памятью при большом количестве уникальных паттернов. Т.е. если у вас в цикле генерируются чуть разные выражения: раньше память тихо росла, сейчас нет.

Предположим что у вас скрипт который обрабатывает тысячи документов и под каждый строит немного свой паттерн. Вот там разница ощутима. На обычном учебном коде с тремя паттернами - нет.

Также обратите внимание: внутренний парсер выражений переписали. Формально это детали реализации. Но именно они дают разницу в скорости на длинных строках. Грубо говоря, все будет круто если работаешь с файлами на мегабайты: прирост виден.
Unicode: наконец-то предсказуемо

Питон давно умеет работать с любыми языками. Но в 3.14 уточнили поведение некоторых классов символов при редких кодировках. Т.к. большинство из нас пишет под кириллицу или латиницу: это затронет немногих. Но знать надо.

Конкретнее: связка re.IGNORECASE и re.UNICODE раньше в граничных случаях давала разное поведение на разных платформах. Например с немецким "ß". Сейчас поправили.

import re

text = "Die Straße ist lang"
pattern = re.compile(r"straße", re.IGNORECASE | re.UNICODE)
result = pattern.search(text)
print(result)

В 3.14 это отработает одинаково везде. В более старых версиях поведение зависело от ОС. Это тема отдельного разговора, сейчас просто запомни что: комбинируй эти флаги без опасений начиная с 3.14.
re.fullmatch() стал говорить правду

Тут есть нюанс - вернее, даже два. re.fullmatch() - это функция которая требует чтобы паттерн совпал со строкой целиком, без остатков. Раньше если внутрь передавали избыточный якорь ^ или $ - он просто игнорировался. Молча. Сейчас движок выдаёт предупреждение. Это хорошо т.к. скрытые ошибки в паттернах лучше видеть сразу.

import re

# Потенциально проблемный паттерн в старых версиях
pattern_old = re.compile(r"^(\d{4})$")
result = re.fullmatch(pattern_old, "2026")

# Лучше писать так
pattern_new = re.compile(r"(\d{4})")
result = re.fullmatch(pattern_new, "2026")
print(result.group()) # 2026

Ну да, разница кажется минимальной. Но именно такие мелочи дают неожиданные баги позже. Пройдитесь по старым скриптам которые "просто работали". Особенно по тем где fullmatch.

DeprecationWarning: читай, не игнорируй

Питон 3.14 добавил несколько новых DeprecationWarning в модуле re. Это значит: некоторые конструкции пока работают, но скоро перестанут. Например, определённые устаревшие escape-последовательности. Т.е. если пишешь паттерн и в консоли появляется предупреждение: не отмахивайся. Через одну-две версии код сломается.

Смотрите, тогда вероятно уже заподозрили: именно поэтому держать руку на пульсе документации важно. Т.к. changelog сам по себе скучный, но незнание его обходится дорого.
Производительность: без преувеличений

Я надеюсь вы не ждёте каких-то невероятных цифр. Прирост скорости в реальных задачах от 5% до 30% в зависимости от типа паттерна. Больше всего выигрывают: длинные строки, сложные паттерны с чередованием (символ |), Unicode-поиск. На простых паттернах и коротких строках разница в пределах погрешности.

import re
import time

text = "a" * 100000 + "b"
pattern = re.compile(r"a+b")

start = time.perf_counter()
for _ in range(1000):
pattern.search(text)
end = time.perf_counter()

print(f"Время: {end - start:.4f} сек")

Запусти на 3.11 и на 3.14. Разница будет. Это лишь синтетика. В боевых условиях всё зависит от паттернов.

Подробнее разберемся как всё это работает изнутри - и закрепим на реальных задачах - тут: https://stepik.org/a/271005

Там 72 урока по документации Питон 3.14. 511 интерактивных задач с автоматической проверкой. Три уровня сложности. 428 тестов. 6 справочников: синтаксис, функции re, отладка, готовые паттерны, примеры.