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
|