请问有没有更简便的方法啊

自己试了一遍,但是有部分不对,并且耗时太长了,有更简便的方法吗?

img


img

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。

如果不熟悉正则表达式的语法,请参考相关资料。

img