【问题描述】
给定一段英文文章,编写程序统计出现次数最多的单词,并将文章中的所有该单词改写为全大写字母。单词之间使用空格或标点符号隔开,单词连写,如“isn't”,看作一个单词。
输入数据:
The wind carries the house for miles and miles.Now Dorothy can stand up because the house isn’t spinning any more.The cyclone had set the house down very gently in the midst of a country of great beauty.There were lovely patches of greensward all about,with stately trees bearing rich fruits.
输出结果:
统计结果:[('the',6)]
THE wind carries THE house for miles and miles.Now Dorothy can stand up because THE house isn’t spinning any more.THE cyclone had set THE house down very gently in THE midst of a country of great beauty.There were lovely patches of greensward all about,with stately trees bearing rich fruits.
【题前思考】
根据问题描述,填写表10-3-1。
表10-3-1 问题分析
【解题思路】
首先将所有的单词按空格、标点分割构成列表,随后将列表中的单词全部转换为小写。统计列表中单词的频数,并将结果保存在一个字典中,然后将字典转化为列表并从大到小排序,输出的第一个元素为出现次数最多的单词。接下来,使用re.sub( )方法将出现次数最多的单词替换为全大写字母。
【程序代码】
【代码分析】
①:将分割符号编译为正则表达式对象。"[^\w']+"表示使用非0-9、a-z、A-Z、'的其他符号作为分隔符,且可以重复1到多次。
②:使用pattern.split( )分割字符串,并去掉空串,保存在列表words中。
③:通过for循环统计words中单词的频数,保存在字典wordNum中。
④:将字典wordNum转换为列表,并按照频数从大到小排序,保存在items中。
⑤:提取出现次数最多的单词。
⑥:将出现次数最多的单词转换为全大写,保存在rpl中备用。
⑦:写出替换过程使用的正则表达式。假设出现次数最多的单词是“the”,则样式“\bthe\b”可以匹配“the”“the.”“(the)”“is the dog”,但不匹配“there”或者“the3”,其中“\b”表示单词边界。
⑧:re.sub( )使用rpl中的大写字符串替换满足样式的所有单词,标记flags=re.I忽略大小写,使得样式能够同时匹配“the”和“The”。参数count表示样式匹配后替换的最大次数,默认0表示替换所有的匹配,此处也可以不写这个参数。
【优化提升】
以上统计单词频数的代码比较烦琐,使用collections包中的Counter类可以提供更为便捷的方法。如果已经获得分割单词的正则对象pattern,使用下面的语句,可以快速得到出现次数最多的单词。
from collections import Counter
res=Counter([w.lower( )for w in pattern.split(s)if len(w.strip( ))>0])
print('出现次数最多的单词:',res.most_common(1)[0])
【技术全貌】
在上面的案例中用到了断言符号\b和标记符号re.I,Python还提供了其他断言和标记符号,表10-3-2和表10-3-3分别列出了部分常见的断言和标记符号,详细说明请扫描二维码查阅官网文档。
表10-3-2 正则表达式断言
续表
表10-3-3 正则表达式标记