54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
|
# -*- coding: UTF-8 -*-
|
|||
|
"""
|
|||
|
@Project -> File :IoD_data_analysis_tool -> ID_code
|
|||
|
@IDE :PyCharm
|
|||
|
@Author :rengengchen
|
|||
|
@Date :2022/5/17 16:00
|
|||
|
@Desc :
|
|||
|
"""
|
|||
|
import re
|
|||
|
|
|||
|
re_ID = re.compile(r'^\d{6}(?:18|19|20)?\d{2}(?:0[1-9]|1[012])(?:(?:[0-2][1-9])|10|20|30|31)\d{3}[0-9xX]$')
|
|||
|
|
|||
|
|
|||
|
def validate_identity_code(code: str):
|
|||
|
"""
|
|||
|
身份证格式校验
|
|||
|
:param code:
|
|||
|
:return:
|
|||
|
"""
|
|||
|
city = {'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': "国外 "}
|
|||
|
tip = ""
|
|||
|
p = True
|
|||
|
|
|||
|
if re_ID.match(code) is None:
|
|||
|
tip = "身份证号格式错误"
|
|||
|
p = False
|
|||
|
|
|||
|
|
|||
|
elif not city[code[:2]]:
|
|||
|
tip = "地址编码错误"
|
|||
|
p = False
|
|||
|
else:
|
|||
|
# 18位身份证需要验证最后一位校验位
|
|||
|
if len(code) == 18:
|
|||
|
code = code.split('')
|
|||
|
# ∑(ai × Wi)(mod 11)
|
|||
|
# 加权因子
|
|||
|
factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
|
|||
|
# 校验位
|
|||
|
parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
|
|||
|
sum = 0
|
|||
|
for i in range(17):
|
|||
|
ai = code[i]
|
|||
|
wi = factor[i]
|
|||
|
sum += ai * wi
|
|||
|
i += 1
|
|||
|
if parity[sum % 11] != code[17]:
|
|||
|
tip = "校验位错误"
|
|||
|
p = False
|
|||
|
return p, tip
|