去年接到一个任务,一直给拖到了今天,再这么下去可不行,今天我就要让你们看看我的厉害
任务是这样的:创建一个程序,读入文本文件,并让用户在该文本出现ADJECTIVE 、NOUN、ADVERB或VERB等单词的地方,加上他们自己的文本
冷静分析:首先是要查找出来这几个关键词,然后提示用户输入要替代的词语,替换原文本的相应词语,储存为一个新文本文件
任务很简单,只需要写出正确的正则表达式完成查找,然后使用 re.sub() 方法完成替换
1)正则表达式
matchWord=re.compile(r'adjective|noun|verb|adverb',re.IGNORECASE)
2)替换
for i in range(len(accept)):
text=matchWord.sub(accept[i],text,1)
完整代码如下
#! python3
# chapter08-test02.py - 读入文本文件,并让用户在该文本出现ADJECTIVE 、NOUN、ADVERB
#或VERB等单词的地方,加上他们自己的文本
import re,os
text='''The ADJECTIVE panda walked to the NOUN and then VERB .A nearby NOUN was
unaffected by these events'''
matchWord=re.compile(r'adjective|noun|verb|adverb',re.IGNORECASE)
aOrAnRegex=re.compile(r'^\s[aeiou]',re.IGNORECASE)
accept=[]#用于保存输入值
#循环打印查找出来的关键字,保存输入的替代值
for keyword in matchWord.findall(text):
#判断用a还是an
aOrAn='a' #在逻辑分支里改变的变量要考虑是否复原
keyword=' '+keyword
if(aOrAnRegex.search(keyword)):
aOrAn='an'
print(' Enter '+aOrAn+str(keyword)+':')
accept.append(str(input()))
#替换
#matchRegex=re.compile(r'mark') #这里新建了一个re对象,因为sub()方法会一次替换掉所有的
#符合内容,即不能拿多个不同的值去替换字符串中不同的值
#会将所有的查找结果看成一类,再拿传入的参数去替换
for i in range(len(accept)):
text=matchWord.sub(accept[i],text,1)
print(text)
#将结果保存为文本文件
resultFile=open('result.txt','w')
resultFile.write(text)
resultFile.close()
遇见的问题
正则表达式不会写
下面我的第一想法,因为* ?+组合不好所以放弃了
1 matchWord=re.compile(r'''( 2 (adjective)+ 3 (noun)+ 4 )''',re.VERBOSE|re.IGNORECASE)
我又想到了方括号会匹配里面的任意一个字符,就写成了这样,希望程序能把里面有括号的内容看成一个整体去匹配
1 matchWord=re.compile(r'''( 2 [(adjective)(noun)] 3 )''',re.VERBOSE|re.IGNORECASE)
替换也不会
发现了一个问题:因为 sub() 方法是一次替换全部的查询结果,且只接受一个参数去替换,所以这里遇到了困难
#替换
for i in range(len(accept)):
text=matchWord.sub(accept[i],text)
又改成了这样
#替换
for i in range(len(accept)):
result=matchWord.sub(accept[i],text)
获得的启发:
刚开始学习某个方面的时候,肯定会遇到困难,怎样去解决困难,思考的时候,要明白自己由于刚接触,会有很多的函数还不知道,而这些,往往是解决当前难题的关键,要注意去搜索,搜索的时候有个建议,先去想一下与这些有没有类似的,再以此为关键去搜索
在逻辑分支里面改变的变量都要考虑是否复原
关于 sub() 方法的详细介绍:https://www.cnblogs.com/nkwy2012/p/6548812.html