以替换为主的疯狂填词、sub()介绍
去年接到一个任务,一直给拖到了今天,再这么下去可不行,今天我就要让你们看看我的厉害
任务是这样的:创建一个程序,读入文本文件,并让用户在该文本出现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()介绍的更多相关文章
- Python实践练习:疯狂填词
题目 创建一个疯狂填词(Mad Libs)程序,它将读入文本文件,并让用户在该文本文件中出现 ADJECTIVE.NOUN.ADVERB 或 VERB 等单词的地方,加上他们自己的文本. 例如,一个文 ...
- 通过jarjar.jar来替换jar包名的详细介绍
有时候我们根据一些场景 需要替换第三方jar包的包名,比如Android广告平台sdk,更换他们jar包包名的话,可以防止市场检测到有广告插件,所以,今天就介绍一下如何使用jarjar.jar工具来替 ...
- 个性二维码开源专题<替换元素点>
基础方法:ChangeFillShape //修改填充形状 ChangeFillShape(...) // 摘要: // 修改填充形状 // // 参数: // g: // 图形画板 // // Fo ...
- C# 替换Word文本—— 用文档、图片、表格替换文本
编辑文档时,对一些需要修改的字符或段落可以通过查找替换的方式,快速地更改.在C# 在word中查找及替换文本一文中,主要介绍了在Word中以文本替换文本的方法,在本篇文章中,将介绍如何用一篇Word文 ...
- js replace替换字符串,同时替换多个方法
在实际开发中,经常会遇到替换字符串的情况,但是大多数情况都是用replace替换一种字符串,本文介绍了如何使用replace替换多种指定的字符串,同时支持可拓展增加字符串关键字. let conten ...
- PHP替换指定字符串
在PHP中,有两个函数可以实现字符串替换,strtr()和str_repalce()函数. 首先我们简单了解下strtr()函数的定义及语法. strtr:转换指定字符. 两个语法: 第一种语法: s ...
- WorkFlow业务介绍
WorkFlow简介 WorkFlow在我们的系统中,解释为系统提示更为恰当一下,当一件事情发生的时候可能需要通知某些人,这样其他人就可以做后续的处理了. 两个SST dts_workflow - W ...
- APK签名替换检测
APK二次打包的危害 APK二次打包是Android应用安全风险中的一部分, 一般是通过反编译工具向应用中插入广告代码与相关配置,再在第三方应用市场.论坛发布.打包党对移动App带来的危害有以下几种: ...
- SNMP介绍及使用,超有用,建议收藏!
写在前面 如果你是对SNMP完全不了解,或者只想学习如何使用现成的SNMP工具,那你找对了文章,但如果你希望学习SNMP具体协议内容,推荐阅读官方的RFC文档. 1. 简介 SNMP(Simple N ...
随机推荐
- KMP算法中求next数组的实质
在串匹配模式中,KMP算法较蛮力法是高效的算法,我觉得其中最重要的一点就是求next数组: 看了很多资料才弄明白求next数组是怎么求的,我发现我的忘性真的比记性大很多,每次看到KMP算法求next数 ...
- bower 代理
bower 设置: 修改 .bowerrc 文件(如无则新增): { "proxy": "http://proxy.mysite.com:8080", &quo ...
- 51nod 1307 绳子与重物 (标记父节点更新即可)
1307 绳子与重物 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有N条绳子编号 0 至 N - 1,每条绳子后面栓了一个重物重量为Wi,绳子的最大负重为Ci. ...
- uva 11584 - 字符串 dp
题目链接 一个长度1000的字符串最少划分为几个回文字符串 ---------------------------------------------------------------------- ...
- eclipse的maven工程视图切换
上面图切换成下面图: 点击eclipse右上角,如下图红圈,然后在选择javaEE这样就切换成javaEE视图了
- 路飞学城Python-Day12(practise)
# 函数基础# 1.写函数,计算传入数字参数的和(动态传参)# def sum_num(x,y):# return x+y# print(sum_num(1,2))# 2.写函数,用户传入修改的文件名 ...
- [ZJOI2007]捉迷藏 (点分树+堆*3)
点分树一点都不会啊(还是太菜了) 点分树就是我们点分治构成的新树.满足深度很小. 然后我们就可以在上面瞎维护东西了. 三个大根堆: \(C[u]\)里装的是点分树中u的子树所有点到点分树中u的父亲的距 ...
- 前端之JavaScript概述
ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这门语言能够成为国 ...
- Edward Frenkel关于几何化朗兰兹纲领的采访
本文来自:菲尔兹奖座谈会 博客 Edward Frenkel教授的主要研究方向是数学与量子物理中的对称.他现在在做的许多问题都与朗兰兹纲领有关.他现在是加州大学伯克利分校的数学教授. 在今年的菲尔兹奖 ...
- libTIFF 图像读取与保存
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/YhL_Leo/article/details/49848391 1 头文件 libtif ...