python⾝份证号码正则表达式校验(含最后⼀位的校验值规则)请仔细阅读注释
包含了15位和18位⾝份证号码的判断,正则表达式较长,请左右滑动查看。
import re
def is_id_number(id_number):
if len(id_number) != 18 and len(id_number) != 15:
print('⾝份证号码长度错误')
return False
regularExpression = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|" \
"(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)"
# 假设18位⾝份证号码:410001************ 410001 19910101 123X
# ^开头
# [1-9] 第⼀位1-9中的⼀个 4
# \\d{5} 五位数字 10001(前六位省市县地区)
# (18|19|20) 19(现阶段可能取值范围18xx-20xx年)
# \\d{2} 91(年份)
# ((0[1-9])|(10|11|12)) 01(⽉份)
# (([0-2][1-9])|10|20|30|31)01(⽇期)
# \\d{3} 三位数字 123(第⼗七位奇数代表男,偶数代表⼥)
# [0-9Xx] 0123456789Xx其中的⼀个 X(第⼗⼋位为校验值)
# $结尾
# 假设15位⾝份证号码:410001********* 410001 910101 123
# ^开头
python正则表达式不包含
# [1-9] 第⼀位1-9中的⼀个 4
# \\d{5} 五位数字 10001(前六位省市县地区)
# \\d{2} 91(年份)
# ((0[1-9])|(10|11|12)) 01(⽉份)
# (([0-2][1-9])|10|20|30|31)01(⽇期)
# \\d{3} 三位数字 123(第⼗五位奇数代表男,偶数代表⼥),15位⾝份证不含X
# $结尾
if re.match(regularExpression, id_number):
if len(id_number) == 18:
n = id_number.upper()
# 前⼗七位加权因⼦
var = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
# 这是除以11后,可能产⽣的11位余数对应的验证码
var_id = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
sum = 0
for i in range(0, 17):
sum += int(n[i]) * var[i]
sum %= 11
if (var_id[sum]) != str(n[17]):
print("⾝份证号规则核验失败,校验码应为", var_id[sum], ",当前校验码是:", n[17])
return False
return True
else:
return False
if __name__ == '__main__':
result = is_id_number('410001************')
print(result)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论