首页 > 技术文章 > 以替换为主的疯狂填词、sub()介绍

Gaoqiking 2019-02-28 15:37 原文

去年接到一个任务,一直给拖到了今天,再这么下去可不行,今天我就要让你们看看我的厉害

任务是这样的:创建一个程序,读入文本文件,并让用户在该文本出现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

推荐阅读