我试图让自己了解if|else模式匹配如何在 python 中工作,因此从文档中创建了以下测试。据我所知,它无法按文档工作,但我已经学会假设我错过了某个关键步骤。
在这个测试案例中,第三项应该失败,因为它缺少它的结束“>”。
In [1]: import re, sys
In [2]: regex = re.compile('(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$)')
In [3]: cases = ['<user@host.com>', 'user@host.com', '<user@host.com', 'user@host.com>']
In [4]: [ re.search(regex, _) and ("match:", _) or ("fail:", _) for _ in cases ]
Out[4]:
[('match:', '<user@host.com>'),
('match:', 'user@host.com'),
('match:', '<user@host.com'),
('fail:', 'user@host.com>')]
In [5]: sys.version
Out[5]: '3.6.5 |Anaconda custom (64-bit)| (default, Apr 26 2018, 08:42:37) \n[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]'
相关的:
(?(id/name)yes-pattern|no-pattern)
将尝试匹配具有yes-pattern 给定 id 或名称的组是否存在,如果不存在则使用 no-pattern。no-pattern是可选的,可以省略。例如, (<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$)是一个糟糕的电子邮件匹配模式,它将与 ' <user@host.com>'和 ' '匹配user@host.com,但不能与 ' <user@host.com' 或 ' user@host.com>'匹配。
所以我的问题是,我错过了哪一步?尝试了不同的 python 版本和主机/操作系统。
相关分类