在正则表达式中预定义命名的递归子图

Sam*_*tch 0 python regex

注意:我知道现有re模块不支持这一点,我使用的是将来要更换的新regex模块re.

我需要构建一些复杂的正则表达式,但我也希望这些表达式可以维护.我不希望任何人在几个月后回到这个代码,并且不得不花费数天时间来解开或重写表达式,包括我自己.:P

我以前用过一些PCRE语法来实现这一点,例如:

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

将匹配线: To: Tom Selleck <thomas@gmail.com>

注意2:我不是要匹配电子邮件地址,这只是一个例子.

我看到regex模块已经实现了递归模式,并命名了递归模式,但它似乎不喜欢(?(DEFINE) ... )语法,给出了错误unknown group at position 10.

是否可以在Python中预先定义这样的命名模式?

Cas*_*yte 5

由于(?(DEFINE)....)在新的python正则表达式模块中没有类似Perl/PCRE的语法,你可以使用这个技巧(我认为它也适用于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) > $
'''
Run Code Online (Sandbox Code Playgroud)

由于您添加了量词{0},因此您可以获得可以放在任何位置的零宽度组定义.