描述

随着计算机与互联网技术快速发展,电话号码,家庭住址,姓名等个人隐私信息被泄露的风险也越来越高。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
数据脱敏是指对敏感信息进行变形处理,比如将电话号码 ‘13000000000’ 中的四位用 ’‘ 来代替,变为 ‘130**0000’。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
本题要求从输入的学生信息中将手机号码,姓名,学号数据进行脱敏处理。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
处理规则如下:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
学号(13 位或 14 位数串):第 5-11 位修改为 ’
‘ 如 ’0121134567801‘ 修改为 ’0121*01‘‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
姓名:第2位修改为’‘ 如’贾诩‘修改为’贾‘ ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
电话号码(11位数串):第4-7位 修改为’‘ 如‘13000000000’中修改为‘130**0000’‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
输入‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
第一行输入 n,代表 n 个同学的信息‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
依次输入 n 行学生信息数据,每行保存一名学生的学号、姓名、电话号码以空格间隔‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
输出*
‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
将学生数据脱敏后的信息保存到二维列表中,并输出这个二维表。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
如果 n 不是正整数,输出’ERROR‘。(本题保证 n 是整数,且信息完整)

这个问题有这样几个考核点:

  1. 如果 n 不是正整数,输出’ERROR’

    1. if n <= 0:
    2. print('ERROR')
    3. else:
    4. print('脱敏处理结果')
    1. print('ERROR') if n <= 0 else print('脱敏处理结果')
  2. 学号是13 位或 14 位数串不确定,要求将第 5-11 位修改为’‘ 如 ‘0121134567801’ 修改为 ‘0121**01’

建议用字符串的拼接完成,这种方法最为准确,且结果稳定。虽然学号位数不确定,但只要超过11位,长度就不用考虑了,程序不会遇到异常。

  1. line[:4] + '*' * 7 + line[11:]

如果用replace()实现的话,可能会有以下问题:

  1. line = input()
  2. line = line.replace(line[4:11],'*******')
  3. print(line)

输入
1234567890123
输出
1234*123
输入
12341234123412
输出
*4123412
输入
11111111111111
输出
**
这是因为line[4:11] 会得到字符串line中序号为4,5,6,7,8,9,10的字符构成的字符串,而 replace() 替换时,会从头开始去匹配,并替换掉所有匹配到的字符串。
在不确定输入的字符串构成的情况下,用replace()方法得到的结果不稳定,可能会遇到特殊数据无法正确替换。

  1. 电话号码(11位数串):第4-7位 修改为’‘ 如‘13000000000’中修改为‘130*0000’‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬,这个实现方法可以和学号的替换相似:

    1. line[:3] + '*' * 4 + line[7:]
  2. 将学生数据脱敏后的信息保存到二维列表中,并输出这个二维列表:

    1. mask = []
    2. for i in range(n):
    3. mask.append(input().split())
    4. # 或
    5. mask = [input().split() for i in range(n)]
  3. 因姓名字数不确定,但只需替换第二个字符,仍可用字符串的拼接实现。

    1. line = line[0] + '*' + line[2:] # 切片不存在越界的异常,此处不可用索引

    完整参考代码如下,如果先将数据放入列表,再进行处理,问题可以变得更简洁一些: ```python def DataMasking(): mask = [input().split() for i in range(n)] for item in mask:

    1. item[0] = item[0][:4] + '*' * 7 + item[0][11:]
    2. item[1] = item[1][0] + '*' + item[1][2:]
    3. 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()) ```