Python 身份证号

身份证号是中国公民的唯一身份标识符,它由18位数字组成,包含个人的基本信息和校验码。在许多应用中,我们需要对身份证号进行验证、解析和处理。Python作为一种强大的编程语言,提供了丰富的库和函数来处理身份证号。

身份证号的结构

身份证号由18位数字组成,每一位都有特定的含义。下面是身份证号的结构:

| 1-6位   | 7-14位  | 15-17位  | 18位         |
| 地址码  | 生日码  | 顺序码   | 校验码        |
  • 地址码(1-6位):表示身份证持有人所在的行政区划代码,省市区各自有固定的编码。例如,北京的编码为110000。
  • 生日码(7-14位):表示身份证持有人的出生日期,格式为YYYYMMDD。
  • 顺序码(15-17位):表示在同一地址码和出生日期下,同一地区的顺序号。
  • 校验码(18位):根据前面的17位数字计算得出,用于验证身份证号的合法性。

身份证号的校验

每个身份证号的最后一位是校验码,用于验证身份证号的合法性。校验码的计算规则如下:

  1. 将身份证号的前17位数字分别乘以对应的权重因子,从左到右依次为7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。
  2. 将上述结果求和并取模,得到一个余数。
  3. 根据余数在校验码对照表中查找对应的值,将其作为身份证号的最后一位校验码。

下面是校验码对照表:

| 余数  | 校验码  |
| 0    | 1     |
| 1    | 0     |
| 2    | X     |
| 3    | 9     |
| 4    | 8     |
| 5    | 7     |
| 6    | 6     |
| 7    | 5     |
| 8    | 4     |
| 9    | 3     |
| 10   | 2     |

现在,我们来编写一个函数来验证身份证号的合法性:

def validate_id_number(id_number):
    # 校验码对照表
    check_codes = {
        0: '1', 1: '0', 2: 'X', 3: '9', 4: '8',
        5: '7', 6: '6', 7: '5', 8: '4', 9: '3',
        10: '2'
    }
    
    # 权重因子
    weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    
    # 验证长度和格式
    if not isinstance(id_number, str) or len(id_number) != 18 or not id_number[:-1].isdigit():
        return False
    
    # 计算校验码
    checksum = sum([int(digit) * weight for digit, weight in zip(id_number[:-1], weights)]) % 11
    check_code = check_codes.get(checksum)
    
    # 验证校验码
    return id_number[-1] == check_code

解析身份证号

除了验证身份证号的合法性,我们还可以将身份证号解析成更有用的信息,比如性别、出生日期和所在地区。下面是一个解析身份证号的函数:

def parse_id_number(id_number):
    # 地址码对照表
    address_codes = {
        '11': '北京市', '12': '天津市', '13': '河北省', '14': '山西省', '15': '内蒙古自治区',
        '21': '辽