以替换为主的疯狂填词、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 ...
随机推荐
- HD-ACM算法专攻系列(8)——排序
题目描述: 源码: #include"iostream" #include"string" using namespace std; void Order(in ...
- Java Servlet 3.0 新特性
Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...
- WPF学习(二) - 绑定
绑定,这个看起来很神奇的东西,于我这种喜欢刨根儿的人而言,理解起来非常困难. WPF绑定的核心思想是:数据层属性值的改变,能反应给展示层,反之亦然,并且这个响应的过程能被分离出来. 传统Winf ...
- HDU 5273 Dylans loves sequence【 树状数组 】
题意:给出n个数,再给出q个询问,求L到R的逆序对的个数 先自己写的时候,是每次询问都重新插入来求sum(r)-sum(l) 果断T 后来还是看了别人的代码---- 预处理一下,把所有可能的区间的询问 ...
- SpringBoot学习笔记(5)----SpringBoot中异常处理的三种方法
对于异常的处理,Spring Boot中提供默认的一个异常处理界面,如下图: 但是在实际的运用开发中,这样的页面显然是不友好的,Spring Boot也提供了自定义异常处理的方式,如下总结三种一场处理 ...
- 玩转HTML5移动页面(优化篇)
标签:h5 页面优化收藏 热门分享 网页设计师必备的 酷站收藏网站 2013年不容错过的app ui素材 40个漂亮的扁平化网页设计欣赏 国内网页设计公司网站欣赏 55套网页设计常用的psd格式UI ...
- DataTable相关操作,筛选,取前N条数据,去重复行,获取指定列数据
#region DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回 /// <summary> /// Dat ...
- centos安装nvidia驱动
大部分 Linux 发行版都使用开源的显卡驱动 nouveau,对于 nvidia 显卡来说,还是闭源的官方驱动的效果更好.最明显的一点是,在使用 SAC 拾取震相的时候,使用官方显卡驱动在刷新界面的 ...
- React 第三天
第三天 01:在组件中使用style行内对象并封装样式对象: CmtItem.jsx: import React from 'react' //第一层封装 将样式对象和UI结构分离 // const ...
- [SCOI2016]美味(可持久化线段树)
可持久化trie树?好像和可持久化权值线段树差不多.. 如果这题没有那个\(x[i]\)这题就是一个裸的可持久化trie树. 仔细想想,多了这个\(x[i]\)之后有什么影响? 就是我们查询区间的时候 ...