我正在尝试了解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
是可选的,可以省略。例如(<)?(w+@w+(?:.w+)+)(?(1)>|$)
是糟糕的电子邮件匹配模式, 将与"<user@host.com>
"以及"user@host.com
"匹配, 但不是"<user@host.com
"或"user@host.com>
"。
所以我的问题是,我错过了哪一步?在不同的python版本和主机/操作系统上尝试过。
您正在使用search
,询问字符串是否包含正则表达式的匹配项,而不是询问它是否匹配。<user@host.com
包含匹配项,特别是user@host.com
。
使用fullmatch
而不是search
。