Предварительное определение именных рекурсивных субпаттерсов в регулярном выражении

Примечание. Я знаю, что ни один из них не поддерживается в существующем модуле re , я использую новый модуль regex предназначенный для замены re в будущем.

Мне нужно создать несколько сложных регулярных выражений, но мне также хотелось бы, чтобы эти выражения поддерживались. Я не хочу, чтобы кто-нибудь возвращался к этому коду спустя несколько месяцев и должен был потратить дни, распутывая или переписывая выражение, включая меня. :П

Существует некоторый синтаксис PCRE, который я ранее использовал для выполнения этого, например:

 / (?(DEFINE) (?<userpart> thomas | richard | harold ) (?<domainpart> gmail | yahoo | hotmail ) (?<tld> com | net | co\.uk ) (?<email> (?&userpart)@(?&domainpart)\.(?&tld) ) ) ^ To: \s+ .* \s+ < (?&email) > $ /ix 

Будет соответствовать линии: To: Tom Selleck <thomas@gmail.com>

Примечание2: Я не пытаюсь сопоставить адреса электронной почты, это всего лишь пример.

Я вижу, что в модуле regex реализованы рекурсивные шаблоны и называются рекурсивные шаблоны, но ему не кажется синтаксис (?(DEFINE) ... ) , дающий unknown group at position 10 ошибки unknown group at position 10 .

Возможно ли предварительно определить именованные шаблоны, подобные этому в Python?

One Solution collect form web for “Предварительное определение именных рекурсивных субпаттерсов в регулярном выражении”

Поскольку в новом модуле regex python нет синтаксиса, такого как Perl / PCRE (?(DEFINE)....) , вы можете использовать этот трюк (я думаю, что он работает и в Ruby):

 import regex pattern = r''' (?<userpart> thomas | richard | harold ){0} (?<domainpart> gmail | yahoo | hotmail ){0} (?<tld> com | net | co\.uk ){0} (?<email> (?&userpart)@(?&domainpart)\.(?&tld) ){0} ^ To: \s+ .* \s+ < (?&email) > $ ''' 

Поскольку вы добавляете квантификатор {0} , вы получаете определения группы нулевой ширины, которые вы можете повсюду помещать.

  • Замените x на y или добавьте y, если нет x
  • Совпадение первого экземпляра поиска регулярных выражений Python
  • Как сократить это выражение с помощью регулярного выражения
  • Python - re.split: дополнительные пустые строки, которые начинаются и заканчиваются
  • регулярное выражение python: получить конечные цифры из строки
  • Шаблон соответствия RegEx в шаблоне
  • Python: строка, которая не начинается с #
  • Группирование данных с помощью регулярного выражения в Python
  •  
    Interesting Posts for Van-Lav

    Разделите список на три списка, чтобы их сумма была близка друг к другу

    Передавать функцию как переменную с одним фиксированным входом

    Дросселирование в приложении Bokeh

    Измените класс ребенка на моделях django

    Получение IAT и EAT из PE

    Проверьте, является ли каталог корневым файлом (файловой системой)

    Можно ли добавлять заголовки в электронные письма, отправляемые приложением?

    ValueError: требуется больше, чем 1 значение для распаковки, ошибка электронной почты django

    Каков стандартный способ добавления N секунд в datetime.time в Python?

    Бит Вектор тактикой приводит к выходу кода 139 в Z3Py

    Почему следующий код Python ошибочен?

    Не удается запустить Flask с использованием Passenger WSGI на общем хостинге Dreamhost

    что означают эти операторы (**, ^,%, //)? – Python?

    python 3.5: TypeError: необходим байтоподобный объект, а не «str» при записи в файл

    Ограниченный поиск корня в scipy

    Python - лучший язык программирования в мире.