首页 > 编程知识 正文

Python判断是否为身份证

时间:2023-11-19 07:49:16 阅读:305419 作者:AVAN

身份证号码是一串特定的数字和字符组合,用于唯一标识一个人的身份信息。在进行数据处理或身份验证时,我们经常需要判断输入的字符串是否为有效的身份证号码。本文将使用Python编程语言,介绍如何判断一个字符串是否为身份证号码。

一、基本身份证号码格式

身份证号码的基本格式包括18位和15位两种。18位身份证号码由前17位数字和最后一位校验码组成,而15位身份证号码仅由15位数字组成。在对身份证号码进行判断时,我们首先要检查其基本格式是否正确。


import re

def is_valid_id_number(id_number):
    if not isinstance(id_number, str):
        return False
    
    pattern = r"^d{17}(d|X|x)$"
    if len(id_number) == 18:
        return bool(re.match(pattern, id_number))
    elif len(id_number) == 15:
        pattern = r"^d{15}$"
        return bool(re.match(pattern, id_number))
    else:
        return False

上述代码中,我们利用正则表达式来匹配身份证号码的格式。首先判断输入是否为字符串类型,然后利用不同的正则表达式模式来匹配18位和15位身份证号码的格式。

二、身份证号码校验码

身份证号码的最后一位是校验码,用于验证前面17位数字的正确性。校验码的计算方法有特定规则,我们需要对身份证号码进行一系列计算,以确定校验码的正确性。


def get_check_digit(id_number):
    coefficient_list = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    validate_char_list = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    
    check_sum = sum([int(id_number[i]) * coefficient_list[i] for i in range(17)])
    check_digit_index = check_sum % 11
    
    return validate_char_list[check_digit_index]

def is_valid_check_digit(id_number):
    if len(id_number) != 18:
        return False
    
    return id_number[-1].upper() == get_check_digit(id_number[:-1]).upper()

上述代码中,我们首先定义了系数列表和校验字符列表,用于计算校验和和获取校验码。然后,通过对前17位数字和系数列表进行计算,得到校验和。最后,将校验和与身份证号码的最后一位进行比较,以验证校验码的正确性。

三、身份证号码地区和生日信息

身份证号码的前六位代表了所在地区的行政区划代码,接下来的八位代表了出生年月日。我们可以通过身份证号码提取出地区和生日信息,并进行进一步验证。


def extract_area(id_number):
    area_dict = {
        '11': '北京',
        '12': '天津',
        '13': '河北',
        '14': '山西',
        '15': '内蒙古',
        # 更多省份...
    }
    
    area_code = id_number[:2]
    return area_dict.get(area_code, '未知')

def extract_birthday(id_number):
    if len(id_number) == 18:
        birthday = id_number[6:14]
    elif len(id_number) == 15:
        birthday = '19' + id_number[6:12]
    else:
        return '未知'
    
    year = birthday[:4]
    month = birthday[4:6]
    day = birthday[6:8]
    
    return f'{year}年{month}月{day}日'

def is_valid_id_number(id_number):
    if not isinstance(id_number, str):
        return False
    
    # 检查基本格式
    pattern = r"^d{17}(d|X|x)$"
    if len(id_number) == 18:
        if not bool(re.match(pattern, id_number)):
            return False
    elif len(id_number) == 15:
        pattern = r"^d{15}$"
        if not bool(re.match(pattern, id_number)):
            return False
    else:
        return False
    
    # 验证校验码
    if len(id_number) == 18:
        if not id_number[-1].upper() == get_check_digit(id_number[:-1]).upper():
            return False
    
    return True

上述代码中,我们利用字典将部分地区行政区划代码映射到对应的地区名称。然后,通过切片操作从身份证号码中提取出地区和生日信息,并进一步处理。最后,将处理结果返回。

四、判断是否为身份证号码


def is_id_number(id_number):
    if is_valid_id_number(id_number):
        area = extract_area(id_number)
        birthday = extract_birthday(id_number)
        
        return f'是有效的身份证号码,地区:{area},生日:{birthday}'
    else:
        return '不是有效的身份证号码'

上述代码中,我们调用前面编写的各个功能函数完成最终的判断。如果输入的字符串是有效的身份证号码,则同时返回地区和生日信息;否则返回不是有效的身份证号码。

至此,我们使用Python编程语言进行了身份证号码的判断。通过验证身份证号码的基本格式、校验码的正确性,以及提取和验证地区和生日信息,我们可以判断一个字符串是否为有效的身份证号码。

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