python正则表达式匹配⾝份证号
# -*- coding: utf-8 -*-
import re
python正则表达式不包含# Errors=['验证通过!','⾝份证号码位数不对!','⾝份证号码出⽣⽇期超出范围或含有⾮法字符!','⾝份证号码校验错误!','⾝份证地区⾮法!']
def checkIdcard(idcard):
Errors = ['验证通过!', '⾝份证号码位数不对!', '⾝份证号码出⽣⽇期超出范围或含有⾮法字符!', '⾝份证号码校验错误!', '⾝份证地区⾮法!']
area = {"11": "北京", "12": "天津", "13": "河北", "14": "⼭西", "15": "内蒙古", "21": "辽宁", "22": "吉林", "23": "⿊龙江", "31": "上海",
"32": "江苏", "33": "浙江", "34": "安徽", "35": "福建", "36": "江西", "37": "⼭东", "41": "河南", "42": "湖北", "43": "湖南",
"44": "⼴东", "45": "⼴西", "46": "海南", "50": "重庆", "51": "四川", "52": "贵州", "53": "云南", "54": "西藏", "61": "陕西",
"62": "⽢肃", "63": "青海", "64": "宁夏", "65": "新疆", "71": "台湾", "81": "⾹港", "82": "澳门", "91": "国外"}
idcard = str(idcard)
idcard = idcard.strip()
idcard_list = list(idcard)
# 地区校验
key = idcard[0: 2]  # TODO: cc  地区中的键是否存在
if key in area.keys():
if (not area[(idcard)[0:2]]):
return Errors[4]
else:
return Errors[4]
# 15位⾝份号码检测
if (len(idcard) == 15):
if ((int(idcard[6:8]) + 1900) % 4 == 0 or (
(int(idcard[6:8]) + 1900) % 100 == 0 and (int(idcard[6:8]) + 1900) % 4 == 0)):
erg = repile(
'[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}$')  # //测试出⽣⽇期的合法    else:
ereg = repile(
'[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}$')  # //测试出⽣⽇期的    if (re.match(ereg, idcard)):
return Errors[0]
else:
return Errors[2]
# 18位⾝份号码检测
elif (len(idcard) == 18):
# 出⽣⽇期的合法性检查
# 闰年⽉⽇:((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]))
# 平年⽉⽇:((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]))
if (int(idcard[6:10]) % 4 == 0 or (int(idcard[6:10]) % 100 == 0 and int(idcard[6:10]) % 4 == 0)):
ereg = repile(
'[1-9][0-9]{5}(19[0-9]{2}|20[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]$')    else:
ereg = repile(
'[1-9][0-9]{5}(19[0-9]{2}|20[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]    # //测试出⽣⽇期的合法性
if (re.match(ereg, idcard)):
# //计算校验位
S = (int(idcard_list[0]) + int(idcard_list[10])) * 7 + (int(idcard_list[1]) + int(idcard_list[11])) * 9 + (int(
idcard_list[2]) + int(idcard_list[12])) * 10 + (int(idcard_list[3]) + int(idcard_list[13])) * 5 + (int(
idcard_list[4]) + int(idcard_list[14])) * 8 + (int(idcard_list[5]) + int(idcard_list[15])) * 4 + (int(
idcard_list[6]) + int(idcard_list[16])) * 2 + int(idcard_list[7]) * 1 + int(idcard_list[8]) * 6 + int(
idcard_list[9]) * 3
Y = S % 11
M = "F"
JYM = "10X98765432"
M = JYM[Y]  # 判断校验位
if (M == idcard_list[17]):  # 检测ID的校验位
return Errors[0]
else:
else:
return Errors[3]
else:
return Errors[2]
else:
return Errors[1]
if __name__ == "__main__":
checkIdcard()
很实⽤, 地区校验 修改⽹上类似⽂章错误的地⽅O(∩_∩)O~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。