首页 > 解决方案 > 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)

如果具有给定 id 或 name 的组存在,将尝试匹配,yes-pattern 如果不存在,则使用 no-pattern。no-pattern是可选的,可以省略。例如, (<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$)是一个糟糕的电子邮件匹配模式,它将匹配 ' <user@host.com>' 以及 ' user@host.com',但不匹配 ' <user@host.com' 和 ' user@host.com>'。

所以我的问题是,我错过了哪一步?尝试了不同的 python 版本和主机/操作系统。

标签: pythonregexif-statementdocumentation

解决方案


您正在使用search,询问字符串是否包含您的正则表达式的匹配项,而不是询问它是否匹配。<user@host.com包含一个匹配项,特别是user@host.com.

使用fullmatch而不是search.


推荐阅读