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

Примечание. Я знаю, что ни один из них не поддерживается в существующем модуле 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} , вы получаете определения группы нулевой ширины, которые вы можете повсюду помещать.

  • Почему группа повторных захватов возвращает эти строки?
  • URL-адрес регулярного выражения, исключая конкретный домен, не соответствующий правилу
  • Обнаружение повторений в строке
  • Python RE (слово для проверки первой буквы чувствительно к регистру и остальное нечувствительно к регистру)
  • Исходный паттерн Python соответствует
  • регулярное выражение python. Извлечение текста между шаблонами
  • Сопоставьте строку с несколькими регулярными выражениями, используя Python
  • Ссылка Python re.sub назад не назад
  • Python - лучший язык программирования в мире.