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

任务是这样的:创建一个程序,读入文本文件,并让用户在该文本出现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. NPInter数据集的奇葩标号的出坑秘籍

    这篇恐怕是有始以来命名最无奈标题了.需要写一下攻略. 业内人士都熟知NPInter,但是该数据库一直以来访问受限.不过终于能访问得到数据集. 但是蛋疼的是2.0的数据库id的命名方法实在奇葩,想了很多 ...

  2. swift语言点评八-枚举

    总结:swift中的枚举可以看作变量可以作为case匹配参数的类 Enumerations 枚举的作用:状态列举与匹配 枚举值与类型 If a value (known as a “raw” valu ...

  3. Linux下编译,安装Apache httpd服务器

    环境:ubuntu 16.0.4 Apache官网下载Apache httpd压缩包:httpd-2.4.27.tar.gz,安装之前请确定安装了make工具,我安装的是GNU make 解压文件 s ...

  4. jQuery更改样式

    $(".input_check_2").css("left","31px"); //更改left的值

  5. Maven缺少jar添加方式

    Maven 中央仓库地址: 1. http://www.sonatype.org/nexus/ 2. http://mvnrepository.com/ (本人推荐仓库) 3. http://repo ...

  6. BZOJ 2287 【POJ Challenge】消失之物(DP+容斥)

    2287: [POJ Challenge]消失之物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 986  Solved: 572[Submit][S ...

  7. 【转载】spring boot 链接 虚拟机(Linux) redis

    原文:https://www.imooc.com/article/43279?block_id=tuijian_wz 前提是你已经安装redis且支持远程连接,redis的安装这里不再赘述,有需要的可 ...

  8. setjmp()和longjmp()函数

    之前我们讲到了过程活动记录(AR),那么如何来操纵AR呢,一个可能的方法是,根据局部变量的地址进行推算,例如对于上面的a函数,执行a函数时的当前AR地址就是参数i的地址偏移8个字节,也就是 ((cha ...

  9. c++_benchMark_vector_list_deque

    title: c++_benchMark_vector_list_deque date: 2015-08-01 22:32:39 作者:titer1 + ZhangYu 出处:www.drysalte ...

  10. iOS 时间类经常用法

    //当前日前日期 NSDate *today = [NSDate date]; //时区 NSTimeZone *zone = [NSTimeZone systemTimeZone]; //设置间隔 ...