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

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

  

遇见的问题

正则表达式不会写  

下面我的第一想法,因为* ?+组合不好所以放弃了

 matchWord=re.compile(r'''(
(adjective)+
(noun)+
)''',re.VERBOSE|re.IGNORECASE)

  我又想到了方括号会匹配里面的任意一个字符,就写成了这样,希望程序能把里面有括号的内容看成一个整体去匹配

 matchWord=re.compile(r'''(
[(adjective)(noun)]
)''',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

以替换为主的疯狂填词、sub()介绍的更多相关文章

  1. Python实践练习:疯狂填词

    题目 创建一个疯狂填词(Mad Libs)程序,它将读入文本文件,并让用户在该文本文件中出现 ADJECTIVE.NOUN.ADVERB 或 VERB 等单词的地方,加上他们自己的文本. 例如,一个文 ...

  2. 通过jarjar.jar来替换jar包名的详细介绍

    有时候我们根据一些场景 需要替换第三方jar包的包名,比如Android广告平台sdk,更换他们jar包包名的话,可以防止市场检测到有广告插件,所以,今天就介绍一下如何使用jarjar.jar工具来替 ...

  3. 个性二维码开源专题<替换元素点>

    基础方法:ChangeFillShape //修改填充形状 ChangeFillShape(...) // 摘要: // 修改填充形状 // // 参数: // g: // 图形画板 // // Fo ...

  4. C# 替换Word文本—— 用文档、图片、表格替换文本

    编辑文档时,对一些需要修改的字符或段落可以通过查找替换的方式,快速地更改.在C# 在word中查找及替换文本一文中,主要介绍了在Word中以文本替换文本的方法,在本篇文章中,将介绍如何用一篇Word文 ...

  5. js replace替换字符串,同时替换多个方法

    在实际开发中,经常会遇到替换字符串的情况,但是大多数情况都是用replace替换一种字符串,本文介绍了如何使用replace替换多种指定的字符串,同时支持可拓展增加字符串关键字. let conten ...

  6. PHP替换指定字符串

    在PHP中,有两个函数可以实现字符串替换,strtr()和str_repalce()函数. 首先我们简单了解下strtr()函数的定义及语法. strtr:转换指定字符. 两个语法: 第一种语法: s ...

  7. WorkFlow业务介绍

    WorkFlow简介 WorkFlow在我们的系统中,解释为系统提示更为恰当一下,当一件事情发生的时候可能需要通知某些人,这样其他人就可以做后续的处理了. 两个SST dts_workflow - W ...

  8. APK签名替换检测

    APK二次打包的危害 APK二次打包是Android应用安全风险中的一部分, 一般是通过反编译工具向应用中插入广告代码与相关配置,再在第三方应用市场.论坛发布.打包党对移动App带来的危害有以下几种: ...

  9. SNMP介绍及使用,超有用,建议收藏!

    写在前面 如果你是对SNMP完全不了解,或者只想学习如何使用现成的SNMP工具,那你找对了文章,但如果你希望学习SNMP具体协议内容,推荐阅读官方的RFC文档. 1. 简介 SNMP(Simple N ...

随机推荐

  1. 51nod 1632 B君的连通

    题目: 这题看起来难,其实这么多概率啥的都是唬人的.甚至连快速幂都不用就可以解. 解法:    n个节点,n-1条边,期望会有一半的边被炸毁(因为总体概率就是50%). 即(n-1)/2条边被炸毁,这 ...

  2. Java中如何解决线程安全问题

    给出一个问题,如下: 解决方案如下: public class Demo_5 { public static void main(String[] args) { //创建一个窗口 TicketWin ...

  3. 一个PHPer如何深入学习ES搜索引擎?

    公司早在一年前就上ES作为后端搜索服务的项目 ,我们PHPer只是负责实现业务接口,es的一些查询,优化技巧由另一组同事(JAVAer)负责,有时,一个需求过来,改动较大时,需要更改查询json语句, ...

  4. javascript 精确加减乘除

    最近一个项目中要使用 JS 实现自动计算的功能,本以为只是实现简单的加.减.乘.除就可以了,于是三下五除二做完了. 正当我窃喜的时候,发现问题了... 进行一些浮点数运算时,计算结果都是让我大跌眼镜啊 ...

  5. 优动漫PAINT中误删工具怎么办?

    最近收到一些小伙伴的提问,说我不小心把 XXX工具从面板上删掉了怎么办?本教程就来给大家分 享一下遇到这个问题时的三种解决方法,遇到同样问题的小伙伴们赶紧进来看一下哟! 优动漫PAINT下载:http ...

  6. 比较好的Dapper封装的仓储实现类 来源:https://www.cnblogs.com/liuchang/articles/4220671.html

    using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; usin ...

  7. 获取鼠标经过处的标签的标签名和id

    <script> var el = window.document.body; // 声明一个变量,默认值为body window.document.body.onmouseover = ...

  8. JavaScript设计模式(biaoyansu)(2)

    单例模式实例 (创建类模式): let elBalance = document.getElementById('balance') function init () { var a = new Di ...

  9. 树上倍增求LCA

    大概思想就是,节点$i$的第$2^{j}$个父节点是他第$2^{j-1}$个父亲的第$2^{j-1}$个父亲 然后可以$O(nlogn)$时间内解决…… 没了? //fa[i][j]表示i的第2^j个 ...

  10. IE模式下EasyUI Combobox无效问题

    近期开发过程中遇到IE浏览器Combobox无法正常加载问题. 经过一番百度说IE渲染过快导致页面渲染完了easyUI Combobox还没有加载.设置延迟加载后依旧无效. 后将input标签的Cla ...