python - 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 版本和主机/操作系统。
解决方案
您正在使用search
,询问字符串是否包含您的正则表达式的匹配项,而不是询问它是否匹配。<user@host.com
包含一个匹配项,特别是user@host.com
.
使用fullmatch
而不是search
.
推荐阅读
- c - 如何将 .h 文件的内容插入字符串以进行运行时编译?
- amazon-cognito - 服务器端:如何刷新过期的令牌?
- assembly - 汇编程序不打印读取字符串
- javascript - 检查未定义的var时如何避免异常?
- mongodb - 如何更新 MongoDB 中嵌套数组元素的字段
- jenkins - Jenkins Multibranch Pipeline - 以编程方式设置构建配置
- ocr - OCR jpeg 文件转文本
- jquery - 检查 $.get 响应并将用户重定向到 URL,但页面不断重新加载
- ckfinder - 是否可以在一个 CKFinder 视图中组合多个 baseDirs?
- r - 在 R 中使用 stringdist 和 data.table 时出现回收错误