目录
一、题干
二、问题1的解答
1. 官方给出的解法
2. 个人优化版
3. 正则表达式解法
二、问题2的解答
1.官方解法:用replace来替换
2. 个人解法:用re.sub()来替换
四、注意事项
附件中有 2 个 Python 源文件和 3 个文本文件,分别对应两个问题,请参考编程模板的py文件,修改其中代码,实现以下功能: 《论语》是儒家学派的经典著作之一,主要记录了孔子及其弟子言行。这里给出了一个网络版本的《论语》,文件名称为“论语.txt”,其内容采用逐句“原文”与逐句“注释”相结合的形式组织,通过【原文】标记《论语》原文内容,通过【注释】标记《论语》注释内容,具体文件格式框架请参考“论语.txt”文件。(本题共计2问,本地回答第一问)
问题1:在PY301-1.py文件中修改代码,提取“论语.txt”文件中的原文内容,输出保存到考生文件夹下,文件名为“论语-原文.txt”。具体要求:仅保留“论语.txt”文件中所有【原文】标签下面的内容,不保留标签,并去掉每行行首空格及行尾空格,无空行。原文小括号及内部数字是源文件中注释项的标记,请保留。示例输出文件格式请参考“论语-原文-输出示例.txt”文件。注意:示例输出文件仅帮助了解输出格式,不作它用。
问题2:在PY301-2.py文件中修改代码,对“论语-原文.txt”或“论语.txt”文件进一步提纯,去掉每行文字中所有小括号及内部数字,保存为“论文-提纯原文.txt”文件。示例输出文件格式请参考“论语-提纯原文-输出示例.txt”文件。注意:示例输出文件仅帮助了解输出格式,不作它用。
提示:建议使用Python集成开发环境IDLE编写、调试及验证程序
问题1提取【原文】后面区域的内容,与单行提取不同,区域提取文本需要处理若干行,为此,需建立一个标记即a参数。当遇到"【原文】"字样时,将a标记为1,后续读入该区域其他行时,按照【原文】对应区域块的文本进行处理。当遇到【注释】标记时,则将a标记为0,表示程序已离开了【原文】区域。根据a变量值,确定是否将文本内容输出到新的文件中。
# -*- coding:utf-8 -*-
'''
This is a python123.io file.
'''
fi = open("论语.txt", "r")
fo = open("论语-原文.txt", "w")
a=0
for line in fi:
if a==1 and line.count("【注释】")==0 and line.count("【原文】")==0:
line = line.strip(" \n")
if line.strip():#判断line是否为空串
fo.write('{}\n'.format(line))
if line.count("【原文】")>0:
a=1
if line.count("【注释】")>0:
a=0
fi.close()
fo.close()
用not in 来替换line.count(),用line.strip()=="【原文】"来替换line.count("【原文】")>0,优化后版本如下:
fi = open("论语.txt", "r",encoding="utf-8")
fo = open("论语-原文.txt", "w")
flag = 0
for line in fi:
if flag == 1 and "【原文】" not in line and "【注释】" not in line :
line = line.strip(" \n")
if line.strip():
fo.write(line.strip()+"\n")
if line.strip() == "【原文】":
flag = 1
if line.strip() == "【注释】":
flag = 0
fi.close()
fo.close()
我们用正则表达式中的re.findall()来查找【原文】和【注释】之间的内容,然后再格式化后输出,代码如下:
import re
with open("论语.txt", "r",encoding="utf-8") as fi, open("论语-原文.txt", "w",encoding="utf-8") as f:
text = re.findall("(原文】)(.*?)(【)",fi.read(),re.S)
for sen in text:
lst = list(sen[1:-1])
for elm in lst:
f.write(elm.strip()+"\n")
要求是去除括号和数字,相比上一题比较简单
fi = open("论语-原文.txt",'r')
fo = open("论语-提纯原文.txt",'w')
for line in fi:
for k in range(100):
line=line.replace('(' + str(k) + ')', '')
fo.write(line)
fi.close()
fo.close()
直接用re.sub(pattern,replacement,string)来把带括号的数字替换为空,代码如下:
import re
fi = open("论语-原文.txt",'r',encoding="utf-8")
fo = open("论语-提纯原文.txt",'w',encoding="utf-8")
text = re.sub("\(\d+\)","",fi.read())
fi.close()
fo.close()