如何编写python检查身份证号是男女
在编写Python程序来检查身份证号的性别时,需要了解身份证号的结构、使用正则表达式进行号码验证、提取性别信息、编写功能函数。其中身份证号的结构是关键,详细了解其组成和编码规则,有助于正确提取性别信息并进行验证。
一、身份证号的结构
身份证号码是由18位数字组成的,每一部分都有特定的含义。以下是身份证号码的结构解析:
- 前1-6位:地址码,表示身份证持有人的所在地。
- 第7-14位:出生日期码,表示身份证持有人的出生日期,格式为YYYYMMDD。
- 第15-17位:顺序码,其中第17位(倒数第二位)用于表示性别,奇数表示男性,偶数表示女性。
- 第18位:校验码,用于验证身份证号的合法性。
二、使用正则表达式进行号码验证
在Python中,可以使用正则表达式来验证身份证号码的合法性。身份证号应满足以下正则表达式模式:
^\d{17}(\d|X)$
:表示前17位为数字,最后一位可以是数字或字母X(为了适应校验码的规则)。
三、提取性别信息
从身份证号码的第17位(倒数第二位)提取性别信息。奇数表示男性,偶数表示女性。
四、编写功能函数
将以上内容结合,编写一个Python函数来检查身份证号的性别。
import re
def validate_id_number(id_number):
"""
验证身份证号是否合法
"""
pattern = re.compile(r'^\d{17}(\d|X)$')
return pattern.match(id_number) is not None
def extract_gender(id_number):
"""
从身份证号中提取性别信息
"""
if not validate_id_number(id_number):
raise ValueError("无效的身份证号")
gender_digit = int(id_number[16]) # 提取倒数第二位
return "男" if gender_digit % 2 != 0 else "女"
示例用法
id_number = "11010519491231002X"
try:
gender = extract_gender(id_number)
print(f"身份证号 {id_number} 的性别是: {gender}")
except ValueError as e:
print(e)
五、身份证号的详细验证
身份证号不仅需要验证格式,还需要验证地址码和出生日期的合法性。以下是详细的验证步骤:
1、地址码验证
地址码(前6位)表示身份证持有人的所在地。可以通过预先定义的地址码表来验证地址码的合法性。以下是部分地址码示例:
address_code_dict = {
'110000': '北京市',
'120000': '天津市',
'130000': '河北省',
# 其他省市的地址码
}
可以编写一个函数来验证地址码:
def validate_address_code(address_code):
"""
验证地址码是否合法
"""
return address_code in address_code_dict
2、出生日期验证
出生日期码(第7-14位)表示身份证持有人的出生日期,格式为YYYYMMDD。可以使用datetime
模块来验证日期的合法性:
from datetime import datetime
def validate_birth_date(birth_date):
"""
验证出生日期是否合法
"""
try:
datetime.strptime(birth_date, '%Y%m%d')
return True
except ValueError:
return False
3、校验码验证
校验码(第18位)用于验证身份证号的合法性。校验码的计算规则如下:
- 将身份证号码前17位数字分别乘以权重系数(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2),并求和。
- 将求和结果除以11,取余数。
- 根据余数从校验码表中查找对应的校验码。
校验码表如下:
余数: 0 1 2 3 4 5 6 7 8 9 10
校验码:1 0 X 9 8 7 6 5 4 3 2
可以编写一个函数来计算校验码:
def calculate_check_digit(id_number):
"""
计算身份证号的校验码
"""
weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_digit_table = '10X98765432'
sum_value = sum(int(id_number[i]) * weights[i] for i in range(17))
remainder = sum_value % 11
return check_digit_table[remainder]
将所有验证步骤整合到一个函数中:
def validate_full_id_number(id_number):
"""
验证完整的身份证号,包括地址码、出生日期、校验码
"""
if not validate_id_number(id_number):
return False
address_code = id_number[:6]
birth_date = id_number[6:14]
check_digit = id_number[-1]
if not validate_address_code(address_code):
return False
if not validate_birth_date(birth_date):
return False
if calculate_check_digit(id_number) != check_digit:
return False
return True
六、完整示例
以下是完整的Python代码示例,包含所有验证步骤和性别提取功能:
import re
from datetime import datetime
address_code_dict = {
'110000': '北京市',
'120000': '天津市',
'130000': '河北省',
# 其他省市的地址码
}
def validate_id_number(id_number):
"""
验证身份证号是否合法
"""
pattern = re.compile(r'^\d{17}(\d|X)$')
return pattern.match(id_number) is not None
def validate_address_code(address_code):
"""
验证地址码是否合法
"""
return address_code in address_code_dict
def validate_birth_date(birth_date):
"""
验证出生日期是否合法
"""
try:
datetime.strptime(birth_date, '%Y%m%d')
return True
except ValueError:
return False
def calculate_check_digit(id_number):
"""
计算身份证号的校验码
"""
weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_digit_table = '10X98765432'
sum_value = sum(int(id_number[i]) * weights[i] for i in range(17))
remainder = sum_value % 11
return check_digit_table[remainder]
def validate_full_id_number(id_number):
"""
验证完整的身份证号,包括地址码、出生日期、校验码
"""
if not validate_id_number(id_number):
return False
address_code = id_number[:6]
birth_date = id_number[6:14]
check_digit = id_number[-1]
if not validate_address_code(address_code):
return False
if not validate_birth_date(birth_date):
return False
if calculate_check_digit(id_number) != check_digit:
return False
return True
def extract_gender(id_number):
"""
从身份证号中提取性别信息
"""
if not validate_full_id_number(id_number):
raise ValueError("无效的身份证号")
gender_digit = int(id_number[16]) # 提取倒数第二位
return "男" if gender_digit % 2 != 0 else "女"
示例用法
id_number = "11010519491231002X"
try:
gender = extract_gender(id_number)
print(f"身份证号 {id_number} 的性别是: {gender}")
except ValueError as e:
print(e)
通过以上步骤,您可以编写一个完整的Python程序来验证身份证号码的合法性,并从中提取性别信息。这个程序不仅能够验证身份证号码的格式,还能够验证地址码、出生日期和校验码的合法性,从而确保身份证号码的准确性和有效性。
相关问答FAQs:
如何通过身份证号判断性别?
身份证号的第17位数字是判断性别的关键。奇数代表男性,偶数代表女性。您可以通过编写简单的Python代码来提取这一位并进行判断。
在Python中如何验证身份证号的合法性?
除了性别,身份证号的合法性也是非常重要的。可以通过正则表达式检查身份证号的格式,并对出生日期进行验证。使用Python的re
模块可以有效地实现这一功能。
怎样处理身份证号的不同长度?
中国身份证号码分为15位和18位。您需要在编写代码时考虑这两种情况。可以通过检查长度来决定使用哪种验证方式,并相应地提取性别信息。对于15位号码,性别通常由最后一位字符决定;而18位号码则需要查看第17位。
