Python实现身份证号码校验

2023-04-03 00:00:00 python 校验 身份证号码

以下是Python实现符合中国身份证要求的身份证号码校验的代码演示。我们使用正则表达式来验证身份证号码的格式是否正确,然后再进行一些其他的校验。

import re

def validate_id_number(id_number):
    """
    验证身份证号码是否合法

    Args:
        id_number (str): 待验证的身份证号码

    Returns:
        bool: 是否合法
    """
    # 验证身份证号码格式是否正确
    pattern = r'^\d{17}[\dXx]$'
    if not re.match(pattern, id_number):
        return False

    # 验证身份证号码中的地区码是否正确
    province_code = id_number[:2]
    if province_code not in area_codes:
        return False

    # 验证身份证号码中的出生日期是否正确
    birthday = id_number[6:14]
    try:
        datetime.datetime.strptime(birthday, '%Y%m%d')
    except ValueError:
        return False

    # 验证身份证号码中的校验码是否正确
    factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    check_code_map = {
        0: '1', 1: '0', 2: 'X', 3: '9', 4: '8',
        5: '7', 6: '6', 7: '5', 8: '4', 9: '3', 10: '2'
    }
    check_sum = sum(int(id_number[i]) * factors[i] for i in range(17))
    check_code = check_code_map[check_sum % 11]
    if check_code != id_number[-1].upper():
        return False

    # 身份证号码验证通过
    return True

# 区域码表,根据具体情况进行修改
area_codes = {
    '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'
}

# 测试
id_numbers = ['110101199003075193', '310101199003075193', '430101199003075193', '320101199003075193', '500101199003075193', '120101199003075193', '999999999999999999']
for id_number in id_numbers:
    if validate_id_number(id_number):
        print(f'{id_number} 是合法的身份证号码')
    else:
        print(f'{id_number} 不是合法的身份证号码')

在这个代码演示中,我们首先定义了一个 validate_id_number 函数,用于验证身份证号码是否合法。该函数接收一个待验证身份证号码作为参数,返回一个布尔值,表示该身份证号码是否合法。

在函数实现中,我们使用了正则表达式来验证身份证号码的格式是否正确,首先要求身份证号码必须为 18 位数字或字母 X(最后一位可能是 X 或 x)。

接下来,我们从身份证号码中提取出地区码、出生日期和校验码,并进行验证。具体来说:

验证地区码:根据身份证号码的第 1 到 2 位来判断地区码是否正确,我们在代码中使用一个名为 area_codes 的集合来存储有效的地区码列表。如果待验证的身份证号码的地区码不在该列表中,则视为不合法。

验证出生日期:身份证号码的第 7 到 14 位是出生日期,格式为 8 位数字。我们可以使用 Python 的 datetime.datetime.strptime 函数将其解析为日期格式,如果出现解析错误,则说明出生日期不合法。

验证校验码:身份证号码的最后一位是校验码,我们需要使用一定的算法来计算出该校验码,然后与身份证号码中的校验码进行比对。具体来说,我们可以使用一个名为 factors 的列表来存储 17 个加权因子,然后将身份证号码中的前 17 位数字与这些因子相乘并求和,得到一个数值。然后将该数值除以 11 取余数,用余数值查找校验码映射表 check_code_map 中对应的校验码。如果该校验码与身份证号码中的校验码不相同,则视为不合法。

最后,我们在代码中使用了一些测试数据对函数进行了测试。对于每个测试数据,我们调用 validate_id_number 函数来判断其是否合法,并输出相应的结果。

相关文章