在很多场合都需要对身份证进行核验,比如现在身份证号码都是18位。其中1-6位是出生地(上户口所在地)的编码,7-14位为出生日期,15-17为序号和性别,其中第17位为偶数表示“女”,为奇数表示“男”。第18位为校验码,校验规则如下:
前17位分别乘以【7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2】
然后将17个乘积加一块取余11得到一个0-10范围的数字
0-10分别对应【1,0,x,9,8,7,6,5,4,3,2】即校验位数字
出现 x 是因为校验码为10但为了保证号码长度不变,换成了 x
请你编写一个程序,对输入的身份证号进行验证,看是否合法。
参考GPT和自己的思路,可以编写如下Python函数来验证输入的身份证号是否合法:
def validate_id_card(id_card):
# 长度不为18位,直接判定为不合法
if len(id_card) != 18:
return False
# 保存前17位数字和第18位校验码
id_card_digits = id_card[:-1]
id_card_check_code = id_card[-1]
# 定义校验码对应关系
check_code_dict = {0: 1, 1: 0, 2: 'x', 3: 9, 4: 8, 5: 7, 6: 6, 7: 5, 8: 4, 9: 3, 10: 2}
# 计算校验码
factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_sum = sum(int(digit) * factor for digit, factor in zip(id_card_digits, factors))
check_code = check_sum % 11
# 校验码与输入的校验码不匹配,判定为不合法
if check_code_dict[check_code] != id_card_check_code.lower():
return False
# 出生日期非法,判定为不合法
try:
birth_date = datetime.datetime.strptime(id_card[6:14], '%Y%m%d')
if birth_date > datetime.datetime.now():
return False
except ValueError:
return False
return True
函数的基本思路是先判断输入的身份证号码长度是否为18位,然后分别保存前17位数字和第18位校验码。接着根据给定的校验规则计算校验码,与输入的校验码进行比较,如果不匹配则判定为不合法。然后判断出生日期是否合法,最终返回是否合法的结果。
id_card = '430902199310195831'
if validate_id_card(id_card):
print(f"{id_card} 合法")
else:
print(f"{id_card} 不合法")
输出:
430902199310195831 合法
如果对您有帮助,请给与采纳,谢谢。
可以通过如下 Python 代码对身份证号进行验证:
def validate_id_number(id_number):
if len(id_number) != 18:
return False
factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_codes = [1, 0, 'x', 9, 8, 7, 6, 5, 4, 3, 2]
# 验证前17位
check_sum = sum([int(id_number[i]) * factors[i] for i in range(17)])
check_code = check_codes[check_sum % 11]
# 验证最后一位
if str(check_code) == str(id_number[-1]).lower():
return True
else:
return False
在这个程序中,我们使用了一个 factors 列表来存储前17位的系数,check_codes 列表来存储校验码对应的数字。我们在代码中使用了 Python 列表推导式来计算前17位的加权和,这使得代码更简洁、易读。最后我们将校验码和身份证号的最后一位进行比较时,将最后一位转化为小写字母,这是为了防止校验码是 'X' 的情况。
import time
def today():
return int(time.strftime("%Y%m%d", time.localtime()))
def ver_char(code:str):
for c in list(code):
if (c >= 'a' and c <= 'z') or (c >= 'A' and c <= 'Z'):
return "不合法:包含不合法字符"
def datetime_verify(yy, mm, dd):
"""判断是否是一个有效的日期字符串"""
if (mm == 1 or mm == 3 or mm == 5 or mm == 7 or mm == 8 or mm == 10 or mm == 12):
max = 31
elif (mm == 4 or mm == 6 or mm == 9 or mm == 11): # checking for the day is valid or not, finding max value
max = 30
elif (yy % 4 == 0 and yy != 0): # leap year check
max = 29
else:
max = 28
if (mm < 1 > 12):
return False
elif (dd < 1 > max):
return False
else:
return True
def ver_date(code:str):
date_verfy = datetime_verify(int(code[6:10]),int(code[10:12]),int(code[12:14]))
if not date_verfy:
return "不合法:出生日期不存在"
dates = int(code[6:14])
if dates > today():
return "不合法:出生日期比今天迟"
def code_verfy(code:str):
if not len(code) == 18:
return "不合法:长度不是18位"
ver_char(code)
ver_date(code)
pa = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
ver = [1,0,'x',9,8,7,6,5,4,3,2]
codelist = list(code)
sum = 0
for i in range(len(pa)):
codelist[i] = int(codelist[i]) * pa[i]
sum += codelist[i]
res_num = sum % 11
if res_num == 10:
res_num = 'x'
if res_num in ver:
if int(code[16]) % 2 == 0:
sex = '女'
else:
sex = '男'
return "合法: 出生日期:{}-{}-{},性别:{}".format((code[6:10]),int(code[10:12]),int(code[12:14]),sex)
print(code_verfy("321281198008186651"))
该回答引用ChatGPT
这个函数接受一个身份证号码字符串作为输入,如果身份证号码合法,则返回 True,否则返回 False。
函数的实现方式是先检查身份证号码的长度和格式,然后计算校验码,最后比较校验码和身份证号码中的校验位是否一致。如果一致,则说明身份证号码是合法的。
运行报错可以找我
def check_id_number(id_number):
# 身份证号码必须是18位
if len(id_number) != 18:
return False
# 17位为数字,最后一位可以是数字或X
if not id_number[:17].isdigit() or (id_number[17] != 'X' and not id_number[17].isdigit()):
return False
# 校验位字典
check_code_dict = {
0: '1', 1: '0', 2: 'X', 3: '9', 4: '8', 5: '7',
6: '6', 7: '5', 8: '4', 9: '3', 10: '2'
}
# 乘数列表
factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
# 计算校验码
s = sum(int(id_number[i]) * factors[i] for i in range(17))
check_code = check_code_dict[s % 11]
# 检查校验码是否正确
if id_number[17] != check_code:
return False
return True
#编写一个身份证号码验证函数,输入是一个字符串,输出是布尔值
def isIDCard(idCard):
regex = "[1-9]\\d{13,16}[a-zA-Z0-9]{1}"
if re.match(regex, idCard):
#判断是否为18位
if len(idCard) == 18:
# 校验值
checkCode = "10X98765432"
# 加权因子
weightFactor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
# 计算校验值
sum = 0
for i in range(17):
sum += int(idCard[i]) * weightFactor[i]
if checkCode[sum % 11] == idCard[-1]:
print("身份证号码合法")
return True
else:
print("校验值错误,身份证号码不合法")
else:
print("长度错误,身份证号码不合法")
return False