util/lib/analysis_package/utils/IDcode_util.py

54 lines
1.8 KiB
Python
Raw Permalink Normal View History

2024-05-12 12:18:24 +00:00
# -*- 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