• Python二级题:MOOC学校名单|关键词提取和查找


    一、题目

    附件文件data.txt是教育部爱课程网中国大学 MOOC 平台的某个 HTML 页面源文件,里面包含了我国参与 MOOC 建设的一批大学或机构列表。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

    问题1:请编写程序,从 data.txt 中提取大学或机构名称列表,将结果写入文件univ.txt,每行一个大学或机构名称,按照大学或机构 在data.txt 出现的先后顺序输出,样例如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

    1. ...
    2. 南京理工大学
    3. ...
    4. 南京师范大学
    5. ...‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

    提示:所有大学名称在 data.txt 文件中以 alt="南京理工大学" 形式存在。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

    问题2:请编写程序,从 univ.txt 文件中提取大学名称,大学名称以出现“大学”或“学院”字样为参考,但不包括“大学生”等字样,将所有大学名称在屏幕上输出,大学各行之间没有空行,最后给出名称中包含“大学”和“学院”的名称数量,同时包含“大学”和“学院”的名称以结尾的词作为其类型。样例如下(样例中数量不是真实结果,北京工商大学嘉华学院算作学院):‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

    1. ...
    2. 南京理工大学
    3. ...
    4. 长沙师范学院
    5. ...
    6. 包含大学的名称数量是10
    7. 包含学院的名称数量是12

    二、第一题解决办法

    1. 官方解法

    通过split的方法,先根据【alt=】来分割字符,再用引号来分割,前者切片取最后一个元素【-1】,后者取第二个元素【1】,即引号后面的内容,所以官方给出的代码如下所示。

    1. fi = open("data.txt","r")
    2. f = open("univ.txt","w")
    3. for line in fi:
    4. if "alt" in line:
    5. dx = line.split("alt=")[-1].split('"')[1]
    6. f.write("{}\n".format(dx))
    7. f.close()
    8. fi.close()

    2. 个人解法

    题目中没有要求,可以用用正则表达式来提取,这就要用到re.findall()来提取。这种好处是不用遍历每一行,直接读取内容提取即可,省时高效。

    1. import re
    2. f = open("univ.txt", "w")
    3. with open("data.txt","r",encoding="utf-8") as fi:
    4. line = fi.read()
    5. line = re.findall('alt="(.*大学)"',line)
    6. for i in line:
    7. f.write(i+"\n")
    8. f.close()

    三、第二题解法

    1. 官方的解法

    官方解法中规中矩,用上了for循环,if判断,文本打开关闭,以及列表切换等等。

    1. n = 0
    2. m = 0
    3. f = open("univ.txt", "r")
    4. lines = f.readlines()
    5. f.close()
    6. for line in lines:
    7. line = line.replace("\n","")
    8. if '大学生' in line:
    9. continue
    10. elif '学院' in line and '大学' in line:
    11. if line[-2:] == '学院':
    12. m += 1
    13. elif line[-2:] == '大学':
    14. n += 1
    15. print('{}'.format(line))
    16. elif '学院' in line:
    17. print('{}'.format(line))
    18. m += 1
    19. elif '大学' in line:
    20. print('{}'.format(line))
    21. n += 1
    22. print("包含大学的名称数量是{}".format(n)) #输出大学计数
    23. print("包含学院的名称数量是{}".format(m)) #输出学院计数

    考虑了排除了大学生这个关键词,然后用列表切片的方法来判断文本的结尾用的是学院还是大学。

    2. 个人的解法

    个人解法中,尽量用正则表达式来简化程序,用【$】限制以大学和学院结尾。用【re.findall()】来判断是否包含某个关键词。

    1. import re
    2. m = 0
    3. n = 0
    4. fi = open("univ.txt", "r",encoding='utf-8')
    5. for line in fi:
    6. line = line.strip()
    7. daxue = re.findall("大学$",line)
    8. if len(daxue)!=0:
    9. m+=1
    10. print(line)
    11. xueyuan = re.findall("学院$",line)
    12. if xueyuan:
    13. print(line)
    14. n+= 1
    15. print("包含大学的数量是{}".format(m))
    16. print("包含学院的数量是{}".format(n))
    17. fi.close()

    三、学后反思

    1. 正则表达式中有很多不错的函数可以使用,如re.sub()可以正则替换,re. findall()批量查找,re.split()根据多个关键字进行切分。如果想使自己的程序更加简化,可以用正则来优化算法。
    2. 简化算法的方案有1)用with open()替换open(); 2)用列表推导式替换for循环;3) 用正则表达式模块re来替换其它循环查换,因为它不仅查找效率高,而且还可以定位,因此非常推荐使用。
    3. 在Python二级的考纲里没有这个re内置模块,复习中不作为重点,但是在日常编程中却功能强大,建议大家牢固掌握。
  • 相关阅读:
    318. 最大单词长度乘积
    i++的错误使用
    9.28 - 每日一题 - 408
    OpenStack学习笔记-Glance组件深入了解
    高新企业认定条件
    RabbitMQ笔记(基础篇)
    基于 SPI 的增强式插件框架设计
    车载以太网-传输层-UDP
    LeetCode --- 2. Add Two Numbers 解题报告
    「SpringCloud」01 Eureka服务注册与发现
  • 原文地址:https://blog.csdn.net/henanlion/article/details/131153711