Python 正则表达式 if|else 不像宣传的那样工作?



我正在尝试了解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

最新更新