首页 > 编程知识 正文

Python输入身份证判断地区

时间:2023-11-21 05:16:57 阅读:291135 作者:TSHL

在Python中,我们可以通过简单的代码来验证身份证号码的合法性,同时也可以从中提取出身份证所属的地区信息。

一、验证身份证号码的合法性

身份证号码是一个18位的字符串,其中最后一位可能是数字或字母X,前17位是固定格式的数字。身份证号码的验证可以通过以下方法实现:


def verify_id_card(id_card: str) -> bool:
    """
    验证身份证号是否有效
    :param id_card: 身份证号
    :return: bool,True表示有效,False表示无效
    """
    # 正则表达式验证身份证基本格式
    if not re.match(r'^d{17}(d|X)$', id_card):
        return False

    # 加权因子列表
    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']

    # 计算校验码
    total = sum([int(id_card[i]) * weight_factor[i] for i in range(17)])
    remainder = total % 11
    check_num = check_code[remainder]

    # 最后一位为X时特殊处理
    if id_card[-1] == 'X':
        return check_num == 'X'

    return check_num == id_card[-1]

其中,身份证号码的基本格式可以使用正则表达式进行验证。然后可以通过计算身份证号码的加权和,得到校验码,最后和身份证号码的最后一位进行比对,判断身份证号码的真伪。

二、提取身份证所属地区信息

在中国,身份证前6位代表所属地区的行政区划代码。以下是部分地区行政区划代码及其对应的名字:


REGION_CODE = {
    '110000': '北京市',
    '120000': '天津市',
    '130000': '河北省',
    '140000': '山西省',
    '150000': '内蒙古自治区',
    '210000': '辽宁省',
    '220000': '吉林省',
    '230000': '黑龙江省',
    '310000': '上海市',
    '320000': '江苏省',
    '330000': '浙江省',
    '340000': '安徽省',
    '350000': '福建省',
    '360000': '江西省',
    '370000': '山东省',
    '410000': '河南省',
    '420000': '湖北省',
    '430000': '湖南省',
    '440000': '广东省',
    '450000': '广西壮族自治区',
    '460000': '海南省',
    '500000': '重庆市',
    '510000': '四川省',
    '520000': '贵州省',
    '530000': '云南省',
    '540000': '西藏自治区',
    '610000': '陕西省',
    '620000': '甘肃省',
    '630000': '青海省',
    '640000': '宁夏回族自治区',
    '650000': '新疆维吾尔自治区',
    '710000': '台湾省',
    '810000': '香港特别行政区',
    '820000': '澳门特别行政区',
}

以下示例代码实现了根据身份证号码提取所属地区信息:


def get_region(id_card: str) -> str:
    """
    从身份证号提取地区
    :param id_card: 身份证号
    :return: str,表示地区
    """
    region_code = id_card[:6]
    region = REGION_CODE.get(region_code)
    return region if region else '未知'

三、完整示例代码

以下是将身份证号码合法性验证、提取所属地区信息和用户输入结合的完整示例代码:


import re

REGION_CODE = {
    '110000': '北京市',
    '120000': '天津市',
    '130000': '河北省',
    '140000': '山西省',
    '150000': '内蒙古自治区',
    '210000': '辽宁省',
    '220000': '吉林省',
    '230000': '黑龙江省',
    '310000': '上海市',
    '320000': '江苏省',
    '330000': '浙江省',
    '340000': '安徽省',
    '350000': '福建省',
    '360000': '江西省',
    '370000': '山东省',
    '410000': '河南省',
    '420000': '湖北省',
    '430000': '湖南省',
    '440000': '广东省',
    '450000': '广西壮族自治区',
    '460000': '海南省',
    '500000': '重庆市',
    '510000': '四川省',
    '520000': '贵州省',
    '530000': '云南省',
    '540000': '西藏自治区',
    '610000': '陕西省',
    '620000': '甘肃省',
    '630000': '青海省',
    '640000': '宁夏回族自治区',
    '650000': '新疆维吾尔自治区',
    '710000': '台湾省',
    '810000': '香港特别行政区',
    '820000': '澳门特别行政区',
}


def verify_id_card(id_card: str) -> bool:
    """
    验证身份证号是否有效
    :param id_card: 身份证号
    :return: bool,True表示有效,False表示无效
    """
    # 正则表达式验证身份证基本格式
    if not re.match(r'^d{17}(d|X)$', id_card):
        return False

    # 加权因子列表
    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']

    # 计算校验码
    total = sum([int(id_card[i]) * weight_factor[i] for i in range(17)])
    remainder = total % 11
    check_num = check_code[remainder]

    # 最后一位为X时特殊处理
    if id_card[-1] == 'X':
        return check_num == 'X'

    return check_num == id_card[-1]


def get_region(id_card: str) -> str:
    """
    从身份证号提取地区
    :param id_card: 身份证号
    :return: str,表示地区
    """
    region_code = id_card[:6]
    region = REGION_CODE.get(region_code)
    return region if region else '未知'


def main():
    id_card = input('请输入身份证号码:')
    if verify_id_card(id_card):
        region = get_region(id_card)
        print(f'您输入的身份证所属地区为:{region}')
    else:
        print('您输入的身份证号码无效!')


if __name__ == '__main__':
    main()

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。