前言
继续练习探索正则表达式在实际场景中的运用,本次项目内容也是我自编自导自演的哈。
——
一、问题背景
相信各位都一定在XX软件或者XX平台注册过账号,注册账号时会需要你填写用户名、密码、手机号、电子邮件等等信息。
如果你填写的某项表单不符合要求,那些系统就会报错,进而无法进入到下一步操作。
那么对于用户所填表单内容进行验证的功能,就是正则表达式最最常见的实际用法之一。
本次就来练习一下,利用正则表达式设计一个简单的表单验证程序。
图示如下:
要求:
- 用户输入信息需满足各自的限定条件
- 用户按照提示一次性输入所有信息内容
- 最后程序根据用户输入信息是否符合规定打印结果。如果信息合法显示“通过”,如果信息不合法显示“不通过”并显示相应的正确提示语句。
程序运行的最终结果应该大致是这样的:
——
二、功能分析
第一步:构建正则表达式
- 根据相应的项目要求,构建所有正则表达式
- 具体包括:用户名、密码及确认密码、电话号码、电子邮箱和身份证号码的正则表达式
第二步:依次匹配用户输入信息
- 用input函数一次性获取所有内容信息
- 将用户输入信息依次与各正则表达式进行匹配
第三步:打印信息
- 判定用户输入信息是否符合规则,并打印出相应的结果
- 如果信息合法显示“通过”
- 如果信息不合法显示“不通过”并显示相应的正确提示语句
框架如下:
import re
# 第一步:构建正则表达式
# 【01】构建用户名正则表达式(仅由中文汉字、英文字母、数字组成,长度3-16位)
# 【02】构建登录密码正则表达式(仅由英文字母、数字、下划线组成,要求密码中同时包含大小写字母和数字,长度8-16位)
# 【03】构建手机号码正则表达式(请输入正确的11位手机号码)
# 【04】构建电子邮件正则表达式(请输入正确的电子邮箱地址)
# 【05】构建身份证号码正则表达式(请输入正确的15位或18位身份证号码)
# 第二步:依次匹配用户输入信息
# 第三步:打印信息
——
三、代码实现
那么我们就来正式写完整的代码了,具体的解释说明也在代码中进行注释。
import re
# 第一步:构建正则表达式
# 【01】构建用户名正则表达式(仅由中文汉字、英文字母、数字组成,长度3-16位)
usernameRegex = re.compile(r'^[\u4e00-\u9fa5a-zA-Z0-9]{3,16}$') # 中间的一大串可以用\w代替,其中[\u4e00-\u9fa5]代表中文字符
# 【02】构建登录密码正则表达式(仅由英文字母、数字、下划线组成,要求密码中同时包含大小写字母和数字,长度8-16位)
passwordRegex = re.compile(r'^((?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])).{8,16}$') # 涉及零宽断言的知识
# 【03】构建手机号码正则表达式(请输入正确的11位手机号码)
numberRegex = re.compile(r'^\d{11}$')
# 【04】构建电子邮件正则表达式(请输入正确的电子邮箱地址)
mailRegex = re.compile(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.([a-zA-Z]{2,4})$')
# 【05】构建身份证号码正则表达式(请输入正确的15位或18位身份证号码)
idRegex = re.compile(r'^((\d{15}|\d{17}(\d|X|x)))$') # 其中18位身份证号码的最后一位可能是X
# 第二步:依次匹配用户输入信息
username = input('请输入用户名(仅由中文汉字、英文字母、数字组成,长度3-16位):\n')
password = input('请输入密码(仅由英文字母、数字、下划线组成,要求密码中同时包含大小写字母和数字,长度8-16位):\n')
password2 = input('请再次输入密码(与上面输入密码保持一致):\n')
number = input('请输入电话号码(请输入正确的11位手机号码):\n')
mail = input('请输入邮箱地址(请输入正确的电子邮箱地址):\n')
idnubmer = input('请输入身份证号码(请输入正确的15位或18位身份证号码):\n')
# 利用re.match进行验证
mo1 = usernameRegex.match(username)
mo2 = passwordRegex.match(password)
mo3 = numberRegex.match(number)
mo4 = mailRegex.match(mail)
mo5 = idRegex.match(idnubmer)
# 第三步:打印信息
print('\n\n*************************************结果显示***************************************')
print('用户名验证:\n')
if mo1:
print('通过')
else:
print('不通过,用户名仅由中文汉字、英文字母、数字组成,长度3-16位')
print('--------------------------------------------------------------------------------------\n')
print('密码验证:\n')
if mo2:
print('通过')
else:
print('不通过,密码仅由英文字母、数字、下划线组成,要求密码中同时包含大小写字母和数字,长度8-16位')
print('\n--------------------------------------------------------------------------------------')
print('密码确认:')
if (password2 == password) and (mo2 != None):
print('通过')
else:
print('不通过,请重新检查')
print('\n--------------------------------------------------------------------------------------')
print('电话号码验证:')
if mo3:
print('通过')
else:
print('不通过,请输入正确的11位手机号码')
print('\n--------------------------------------------------------------------------------------')
print('电子邮箱验证:')
if mo4:
print('通过')
else:
print('不通过,请输入正确的电子邮箱地址')
print('\n--------------------------------------------------------------------------------------')
print('身份证号码验证:')
if mo5:
print('通过')
else:
print('不通过,请输入正确的15位或18位身份证号码')
print('\n--------------------------------------------------------------------------------------')
具体的测试过程就不再这里演示了,小试了下,基本不按照规则输入信息的都会显示“不通过”。
——
四、复盘总结
- 关键点还是在于各种正则表达式本身的构造,如何将需求转化为代码
- 新学习到了中文字符的正则表达式:[\u4e00-\u9fa5]
- 通过构造要求同时含有大小写字符和数字的密码正则表达式,初步知道了零宽断言的知识,当然还需要再进一步学习总结。
——