自己试了一遍,但是有部分不对,并且耗时太长了,有更简便的方法吗?
def is_valid_id_number(id_number):
factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
parity = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
if len(id_number) != 18:
return False
if not id_number[:-1].isdigit():
return False
if id_number[-1] not in parity:
return False
sum = 0
for i in range(17):
sum += int(id_number[i]) * factor[i]
check = parity[sum % 11]
return check == id_number[-1]
n = int(input())
count = 0
for i in range(n):
id_number = input()
if is_valid_id_number(id_number):
count += 1
print(count)
以下是Python代码实现:
# 导入正则表达式模块
import re
n = int(input()) # 输入待判断的号码个数
count = 0 # 计数器,记录正确的身份证号码个数
# 循环输入并判断每个身份证号码是否合法
for i in range(n):
id_num = input().strip() # 去除字符串首尾空格
pattern = r'^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}[\dxX]$'
if re.match(pattern, id_num) is not None:
count += 1
print(count) # 输出正确身份证号码的个数
解释一下代码:
首先通过 import re
导入 Python 正则表达式模块。接着通过 input()
获取待判断的身份证号码个数 n
。然后通过循环将每个身份证号码输入并判断是否合法,如果是,则计数器 count
加一。最后输出计数器即可。
正则表达式用于判断身份证号码的格式是否符合规范。具体来说,它由以下部分组成:
^[1-9]\d{5}
:表示前六位是地区编码,以非零开头。(18|19|20)\d{2}
:表示年份编码,必须是18、19或20开头,后面跟着2位数字。(0[1-9]|1[012])
:表示月份编码,必须是01到12之间的数字。(0[1-9]|[12]\d|3[01])
:表示日期编码,必须是01到31之间的数字,但是对于某些特定月份(如2月),日期编码应该符合实际情况。\d{3}
:表示顺序编码,每个人的身份证号码都不一样。[\dxX]$
:表示校验位,用于检测身份证号码是否正确。其中,x或X代表10。如果不熟悉正则表达式的语法,请参考相关资料。