注意:我知道现有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中预先定义这样的命名模式?
由于(?(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},因此您可以获得可以放在任何位置的零宽度组定义.
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |