首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python中的正则表达式匹配USN?

如何使用Python中的正则表达式匹配USN?
EN

Stack Overflow用户
提问于 2017-09-04 06:42:48
回答 5查看 1.4K关注 0票数 0

给定一个USN: 1722AB3401和范围: 3401到3470。

如果给出1722AB3433作为输入,它应该显示有效的USN,如果不是(例如: 1722AB3499),它应该说无效USN。

如何使用python来解决这个问题?

我尝试了以下方法(使用Python3.6.x):

代码语言:javascript
复制
import re

pattern = r"1722AB34[0-7][0-9]"

if re.search(pattern, "1722AB3471"):
    print("Valid USN")
else:
    print("Invalid USN")

但是,如果我尝试输入1722AB3471,它会给我一个错误的答案,因为范围是*3401到*3470。

注: USN是大学序列号

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-09-04 06:51:43

混合数范围的Regexes往往相当复杂。就您的情况而言,对于范围为3401-3470的范围,您需要以下内容:

代码语言:javascript
复制
34(0[1-9]|[1-6][0-9]|70)

只有当小数位内的范围变得更长、更复杂时,它才会变得更加复杂。

一个更好的方法是简单地提取这个数字部分,在正则表达式之外进行验证:

代码语言:javascript
复制
usn = '1722AB3471'

m = re.match('1722AB(\d{4})', usn)
if m and 3401 <= int(m.group(1)) <= 3470:
    print('Valid USN')
else:
    print('Invalid USN')
票数 1
EN

Stack Overflow用户

发布于 2017-09-04 06:50:17

您的期望是错误的,因为您的正则表达式显然允许3400.3479。

我不赞成完全使用正则表达式获得验证的尝试,即使它可以处理一个复杂的表达式。

代码语言:javascript
复制
pattern = r"1722AB34(([0-6][0-9])|70)"

我会尝试提取字符后面的数字,并对这个数字进行比较。

票数 2
EN

Stack Overflow用户

发布于 2017-09-04 06:53:08

我倾向于简单地测试你的USN的最后四位数。在if语句中添加一个附加术语:

代码语言:javascript
复制
import re

pattern = r"1722AB34[0-7][0-9]"

usn = "1722AB3470"

if re.search(pattern, usn) and int(usn[-4:]) in range(3401, 3472):
    print("Valid USN")
else:
    print("Invalid USN")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46031575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档