18位身份证号码第7~10位为出生年份(四位数),第11~12位为出生月份,第13~14位代表出生日期,第17位代表性别,奇数为男,偶数为女。 用户输入一个合法的身份证号,请输出用户的出生年月日和性别...
时间: 2024-06-10 13:04:45 浏览: 133
你好,根据你的要求,我可以帮助你解析出输入的身份证号对应的信息。以下是代码实现:
```python
import re
def decode_id_card(id_card):
if not is_valid_id_card(id_card):
return None
# 解析出生年月日和性别
year = id_card[6:10]
month = id_card[10:12]
day = id_card[12:14]
gender = '男' if int(id_card[16]) % 2 == 1 else '女'
return (year, month, day, gender)
def is_valid_id_card(id_card):
# 校验身份证格式是否正确
pattern = re.compile(r'^\d{17}(\d|x|X)$')
if not pattern.match(id_card):
return False
# 校验身份证第18位校验码是否正确
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']
check_sum = sum([int(id_card[i]) * factor[i] for i in range(17)])
if id_card[17].lower() != check_code[check_sum % 11]:
return False
# 校验出生日期是否合法
year = int(id_card[6:10])
month = int(id_card[10:12])
day = int(id_card[12:14])
if month not in range(1, 13):
return False
if day not in range(1, 32):
return False
if month in [4, 6, 9, 11] and day > 30:
return False
if month == 2 and (year % 4 == 0 and day > 29 or year % 4 != 0 and day > 28):
return False
return True
# 测试
id_card = input('请输入一个合法的身份证号码:')
info = decode_id_card(id_card)
if info:
print('出生年月日:{}年{}月{}日,性别:{}'.format(info[0], info[1], info[2], info[3]))
else:
print('输入的身份证号码不合法!')
```
示例输出:
```
请输入一个合法的身份证号码:110101200001017392
出生年月日:2000年01月01日,性别:男
```
在以上代码中,`is_valid_id_card` 函数用于校验输入的身份证号格式是否正确、18位号码的校验码是否正确以及出生日期是否合法。如果校验通过,则调用 `decode_id_card` 函数解析出生年月日和性别。最后,根据解析结果输出相关信息。
注意:以上代码仅供参考,请根据实际项目需求进行适当修改。
阅读全文