好的,以下是验证身份证号的方法:
def verify_id(id_number): """ 验证身份证号码是否符合规则 :param id_number: 身份证号码 :return: True 或 False """ if not isinstance(id_number, str): return False # 长度只能是15或18 if len(id_number) != 15 and len(id_number) != 18: return False # 18位号码末尾可能是数字或X if len(id_number) == 18 and not (id_number[-1].isdigit() or id_number[-1].upper() == 'X'): return False # 省级代码验证 provinces = { '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': '国外' } province_code = id_number[:2] if province_code not in provinces: return False # 出生日期验证 if len(id_number) == 15: birth_year = int('19' + id_number[6:8]) birth_month = int(id_number[8:10]) birth_day = int(id_number[10:12]) else: birth_year = int(id_number[6:10]) birth_month = int(id_number[10:12]) birth_day = int(id_number[12:14]) # 检查年、月、日是否合法 import datetime try: birth_date = datetime.date(birth_year, birth_month, birth_day) except ValueError: return False # 校验码验证 if len(id_number) == 18: # 加权因子 weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 校验码 check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] check_sum = 0 for i in range(17): check_sum += int(id_number[i]) * weight_factor[i] remainder = check_sum % 11 if check_code[remainder] != id_number[-1].upper(): return False return True
该方法基于身份证号基本规则进行验证,包括长度、省级代码、出生日期和校验码。其中,身份证号长度只能是15或18位,且18位号码末尾可能是数字或字母X;省级代码必须是规则中所列出的代码;出生日期必须合法,即年、月、日都要符合要求;校验码是18位身份证号的最后一位,由其他字符经过加权求和再取模得到,并且要满足校验规则。