python判断身份证号日期不合法
时间: 2023-10-25 10:06:54 浏览: 87
可以使用Python的datetime模块来判断身份证号中的日期是否合法,具体实现可以参考以下代码:
```python
import datetime
def is_valid_date(date_str):
try:
datetime.datetime.strptime(date_str, '%Y%m%d')
return True
except ValueError:
return False
id_card = '110101199003075872'
birth_date_str = id_card[6:14]
if is_valid_date(birth_date_str):
print('身份证号中的出生日期合法')
else:
print('身份证号中的出生日期不合法')
```
以上代码中,我们首先定义了一个`is_valid_date`函数,该函数用来判断一个日期字符串是否合法,如果合法则返回True,否则返回False。然后我们从身份证号中提取出出生日期,并调用`is_valid_date`函数来判断其是否合法。如果合法,则输出`身份证号中的出生日期合法`,否则输出`身份证号中的出生日期不合法`。
相关问题
身份证号处理python
身份证号是一种特殊的字符串,通常需要进行一些处理和验证。下面是一些常见的身份证号处理方法:
1. 验证身份证号是否合法。可以使用 Python 的第三方库 `id-validator` 进行验证。安装方法:`pip install id-validator`。使用方法如下:
```python
from id_validator import validator
id_number = '110101199003074036'
valid = validator.is_valid(id_number)
print(valid) # True
```
2. 获取身份证号的出生日期。可以通过身份证号的前六位来获取出生日期。代码如下:
```python
id_number = '110101199003074036'
birth_date = id_number[6:14]
print(birth_date) # '19900307'
```
3. 获取身份证号的性别。可以通过身份证号的倒数第二位来判断性别,偶数为女性,奇数为男性。代码如下:
```python
id_number = '110101199003074036'
gender = int(id_number[-2])
if gender % 2 == 0:
print('女性')
else:
print('男性')
```
4. 获取身份证号的地址信息。可以通过身份证号的前六位来获取地址信息。需要使用第三方库 `id-parser`。安装方法:`pip install id-parser`。使用方法如下:
```python
from id_parser import Parser
id_number = '110101199003074036'
parser = Parser()
info = parser.parse(id_number)
address = info.area.name
print(address) # '北京市东城区'
```
以上是一些处理身份证号的常见方法,可以根据具体需求进行选择。
基于python身份证校验及信息提取
身份证号码共18位,其中前17位为地区和出生年月日信息,最后一位为校验码。以下是基于python实现的身份证校验和信息提取代码:
```python
import re
def check_idcard(idcard):
"""
身份证校验函数
"""
# 校验身份证号码格式
if not re.match(r'^\d{17}(\d|X|x)$', idcard):
return False
# 校验身份证号码的前17位是否合法
province_code = idcard[:2]
if province_code not in PROVINCE_CODE:
return False
birth_year = int(idcard[6:10])
birth_month = int(idcard[10:12])
birth_day = int(idcard[12:14])
if not is_valid_date(birth_year, birth_month, birth_day):
return False
# 校验身份证号码的最后一位是否正确
weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_code = '10X98765432'[sum([int(idcard[i]) * weights[i] for i in range(17)]) % 11]
if check_code != idcard[-1].upper():
return False
return True
def get_idcard_info(idcard):
"""
身份证信息提取函数
"""
province_code = idcard[:2]
province = PROVINCE_DICT.get(province_code, '')
birth_year = int(idcard[6:10])
birth_month = int(idcard[10:12])
birth_day = int(idcard[12:14])
sex = '女' if int(idcard[-2]) % 2 == 0 else '男'
return {
'province': province,
'birth_year': birth_year,
'birth_month': birth_month,
'birth_day': birth_day,
'sex': sex
}
def is_valid_date(year, month, day):
"""
判断日期是否合法
"""
if month < 1 or month > 12:
return False
if day < 1 or day > 31:
return False
if month in [4, 6, 9, 11] and day > 30:
return False
if month == 2:
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
if day > 29:
return False
else:
if day > 28:
return False
return True
# 省份代码和名称映射
PROVINCE_DICT = {
'11': '北京市',
'12': '天津市',
'13': '河北省',
'14': '山西省',
'15': '内蒙古自治区',
'21': '辽宁省',
'22': '吉林省',
'23': '黑龙江省',
'31': '上海市',
'32': '江苏省',
'33': '浙江省',
'34': '安徽省',
'35': '福建省',
'36': '江西省',
'37': '山东省',
'41': '河南省',
'42': '湖北省',
'43': '湖南省',
'44': '广东省',
'45': '广西壮族自治区',
'46': '海南省',
'50': '重庆市',
'51': '四川省',
'52': '贵州省',
'53': '云南省',
'54': '西藏自治区',
'61': '陕西省',
'62': '甘肃省',
'63': '青海省',
'64': '宁夏回族自治区',
'65': '新疆维吾尔自治区',
'71': '台湾省',
'81': '香港特别行政区',
'82': '澳门特别行政区'
}
# 省份代码列表
PROVINCE_CODE = list(PROVINCE_DICT.keys())
```
使用示例:
```python
idcard = '11010119900307401X'
if check_idcard(idcard):
idcard_info = get_idcard_info(idcard)
print(idcard_info)
else:
print('身份证号码不合法')
```
输出结果:
```
{'province': '北京市', 'birth_year': 1990, 'birth_month': 3, 'birth_day': 7, 'sex': '男'}
```