import re r=r'^([1-9]\d{5}[12]\d{3}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])\d{3}[0-9xX])$' result = re.match(r,'1234567891011121314') if not result: print('请输入正确的身份证号!')
第一位1-9 [1-9] 后面5位数字0-9 \d{5} 年份:1或2开头,后面三位数字0-9 [12]\d{3} 月份:0开头接1-9或1开头接012 [0][1-9]|1[012] 日期:0开头接1-9或1、2开头接0-9或3开头接0,1 0[1-9]|[12][0-9]|3[01] 3位数字0-9 \d{3} 最后一位为数字或X或x \d|X|x
r = re.compile('^(13\d|14[5|7]|15\d|166|17[3|6|7]|18\d)\d{8}$') result = re.fullmatch(r,'12345678910') if not result: print('请输入正确的手机号码')
验证用户身份正好的合法性(较复杂,根据需求选择)【来自网络,仅供大家需要时参考】
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 import re 2 3 # Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!','身份证地区非法!'] 4 def checkIdcard(idcard): 5 Errors = ['验证通过!', '身份证号码位数不对!', '身份证号码出生日期超出范围或含有非法字符!', '身份证号码校验错误!', '身份证地区非法!'] 6 area = {"11": "北京", "12": "天津", "13": "河北", "14": "山西", "15": "内蒙古", "21": "辽宁", "22": "吉林", "23": "黑龙江", 7 "31": "上海", "32": "江苏", "33": "浙江", "34": "安徽", "35": "福建", "36": "江西", "37": "山东", "41": "河南", "42": "湖北", 8 "43": "湖南", "44": "广东", "45": "广西", "46": "海南", "50": "重庆", "51": "四川", "52": "贵州", "53": "云南", "54": "西藏", 9 "61": "陕西", "62": "甘肃", "63": "青海", "64": "宁夏", "65": "新疆", "71": "台湾", "81": "香港", "82": "澳门", "91": "国外"} 10 idcard = str(idcard) 11 idcard = idcard.strip() 12 idcard_list = list(idcard) 13 # 地区校验 14 if (not area[(idcard)[0:2]]): 15 print(Errors[4]) 16 # 15位身份号码检测 17 if (len(idcard) == 15): 18 if ((int(idcard[6:8]) + 1900) % 4 == 0 or ( 19 (int(idcard[6:8]) + 1900) % 100 == 0 and (int(idcard[6:8]) + 1900) % 4 == 0)): 20 erg = re.compile( 21 '[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$') # //测试出生日期的合法性 22 else: 23 ereg = re.compile( 24 '[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$') # //测试出生日期的合法性 25 if (re.match(ereg, idcard)): 26 print(Errors[0]) 27 else: 28 print(Errors[2]) 29 # 18位身份号码检测 30 elif (len(idcard) == 18): 31 # 出生日期的合法性检查 32 # 闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9])) 33 # 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8])) 34 if (int(idcard[6:10]) % 4 == 0 or (int(idcard[6:10]) % 100 == 0 and int(idcard[6:10]) % 4 == 0)): 35 ereg = re.compile( 36 '[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$') # //闰年出生日期的合法性正则表达式 37 else: 38 ereg = re.compile( 39 '[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$') # //平年出生日期的合法性正则表达式 40 # //测试出生日期的合法性 41 if (re.match(ereg, idcard)): 42 # //计算校验位 43 S = (int(idcard_list[0]) + int(idcard_list[10])) * 7 + (int(idcard_list[1]) + int(idcard_list[11])) * 9 + ( 44 int(idcard_list[2]) + int(idcard_list[12])) * 10 + ( 45 int(idcard_list[3]) + int(idcard_list[13])) * 5 +(int(idcard_list[4])+int(idcard_list[14])) * 8 + ( 46 int(idcard_list[5]) + int(idcard_list[15])) * 4 + ( 47 int(idcard_list[6]) + int(idcard_list[16])) * 2 + int(idcard_list[7]) * 1 + int( 48 idcard_list[8]) * 6 + int(idcard_list[9]) * 3 49 Y = S % 11 50 M = "F" 51 JYM = "10X98765432" 52 M = JYM[Y] # 判断校验位 53 if not idcard_list[17] != M: # 检测ID的校验位 54 print(Errors[0]) 55 else: 56 print(Errors[3]) 57 else: 58 print(Errors[2]) 59 else: 60 print(Errors[1])