描述
随着计算机与互联网技术快速发展,电话号码,家庭住址,姓名等个人隐私信息被泄露的风险也越来越高。
数据脱敏是指对敏感信息进行变形处理,比如将电话号码 ‘13000000000’ 中的四位用 ’‘ 来代替,变为 ‘130**0000’。
本题要求从输入的学生信息中将手机号码,姓名,学号数据进行脱敏处理。
处理规则如下:
学号(13 位或 14 位数串):第 5-11 位修改为 ’‘ 如 ’0121134567801‘ 修改为 ’0121*01‘
姓名:第2位修改为’‘ 如’贾诩‘修改为’贾‘
电话号码(11位数串):第4-7位 修改为’‘ 如‘13000000000’中修改为‘130**0000’
输入
第一行输入 n,代表 n 个同学的信息
依次输入 n 行学生信息数据,每行保存一名学生的学号、姓名、电话号码以空格间隔
输出*
将学生数据脱敏后的信息保存到二维列表中,并输出这个二维表。
如果 n 不是正整数,输出’ERROR‘。(本题保证 n 是整数,且信息完整)
这个问题有这样几个考核点:
如果 n 不是正整数,输出’ERROR’
if n <= 0:
print('ERROR')
else:
print('脱敏处理结果')
print('ERROR') if n <= 0 else print('脱敏处理结果')
学号是13 位或 14 位数串不确定,要求将第 5-11 位修改为’‘ 如 ‘0121134567801’ 修改为 ‘0121**01’
建议用字符串的拼接完成,这种方法最为准确,且结果稳定。虽然学号位数不确定,但只要超过11位,长度就不用考虑了,程序不会遇到异常。
line[:4] + '*' * 7 + line[11:]
如果用replace()实现的话,可能会有以下问题:
line = input()
line = line.replace(line[4:11],'*******')
print(line)
输入
1234567890123
输出
1234*123
输入
12341234123412
输出
*4123412
输入
11111111111111
输出
**
这是因为line[4:11] 会得到字符串line中序号为4,5,6,7,8,9,10的字符构成的字符串,而 replace() 替换时,会从头开始去匹配,并替换掉所有匹配到的字符串。
在不确定输入的字符串构成的情况下,用replace()方法得到的结果不稳定,可能会遇到特殊数据无法正确替换。
电话号码(11位数串):第4-7位 修改为’‘ 如‘13000000000’中修改为‘130*0000’,这个实现方法可以和学号的替换相似:
line[:3] + '*' * 4 + line[7:]
将学生数据脱敏后的信息保存到二维列表中,并输出这个二维列表:
mask = []
for i in range(n):
mask.append(input().split())
# 或
mask = [input().split() for i in range(n)]
因姓名字数不确定,但只需替换第二个字符,仍可用字符串的拼接实现。
line = line[0] + '*' + line[2:] # 切片不存在越界的异常,此处不可用索引
完整参考代码如下,如果先将数据放入列表,再进行处理,问题可以变得更简洁一些: ```python def DataMasking(): mask = [input().split() for i in range(n)] for item in mask:
item[0] = item[0][:4] + '*' * 7 + item[0][11:]
item[1] = item[1][0] + '*' + item[1][2:]
item[2] = item[2][:3] + '*' * 4 + item[2][7:]
return mask
if name == ‘main‘: n = int(input()) print(‘ERROR’) if n <= 0 else print(DataMasking()) ```