^第三题:一个英文的纯文本文件,统计其中的单词出现的个数。

统计什么好呢,就拿Python彩蛋import this来试试吧。(将下列单词保存为“test.txt”)>>> import this

The Zen of Python, by Tim Peters

Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested.

Sparse is better than dense.

Readability counts.

Special cases aren't special enough to break the rules.

Although practicality beats purity.

Errors should never pass silently.

Unless explicitly silenced.

In the face of ambiguity, refuse the temptation to guess.

There should be one-- and preferably only one --obvious way to do it.

Although that way may not be obvious at first unless you're Dutch.

Now is better than never.

Although never is often better than *right* now.

If the implementation is hard to explain, it's a bad idea.

If the implementation is easy to explain, it may be a good idea.

Namespaces are one honking great idea -- let's do more of those!

一、分析(python 正则表达式 re findall 方法能够以列表的形式返回能匹配的子串。)

参考re模块 —— rere.findall(pattern, string, flags=0)

作为一个字符串列表,在字符串中,返回所有非重叠匹配的模式。The string是从左到右扫描的,所以匹配的内容是按照该顺序来的如果模式中存在一个或多个组,请返回组列表;如果模式具有多个组,这将是元组的列表。Return all non-overlapping matches of pattern in string, as a list of strings. The string是从左到右扫描的,所以匹配的内容是按照该顺序来的If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result unless they touch the beginning of another match.

二、实验

先来了解re.findall的用法

>>> import re

>>> re.findall('cat','dog cat dog')

['cat']

>>> re.findall('3','2,4,6,ss,gg')

[]

>>> re.findall('3','2,4,6,ss,gg,3')

['3']

可以看到re.findall就是用来匹配的

下一步需要找到能代表字母的表达式

可以使用方括号来指定多个字符区间。例如正则表达式[A-Za-z]匹配任何字母,包括大写和小写的;正则表达式[A-Za-z][A-Za-z]* 匹配一个字母后面接着0或者多个字母(大写或者小写)。当然我们也可以用元字符+做到同样的事情,也就是:[A-Za-z]+ ,和[A-Za-z][A-Za-z]*完全等价。但是要注意元字符+ 并不是所有支持正则表达式的程序都支持的。关于这一点可以参考后面的正则表达式语法支持情况。

[^a-zA-Z] 简单来说就是任意一个非字母的字符,虽然可以匹配除字母之外的任意字符,但只能是一个,不是多个

如果想匹配多个非字母的字符,需要在后面加量词修饰,如

[^a-zA-Z]+ 表示1个或多个非字母字符

[^a-zA-Z]{5,10} 给示5到10个除字母之外的字符

^[a-z] 匹配以小写字母开头的文本串 ;[^a-z] 表示与不包含小写字母的字符匹配

test.py中没有数字,我们可以选用[^a-zA-Z]

三、代码

import re

def count(filepath):

f = open(filepath, 'r')

s = f.read()

words = re.findall(r'[^a-zA-Z]+', s)

return len(words)

if __name__ == '__main__':

num = count('test.txt')

print (num)

用这个版本得出的结果是208,我还发现了很多大神发布的别的版本,可以参考下,但是得出的最终结果却不一样。

import re

with open('test.txt','r')as f:

data = f.read()

result = re.split(r"[^a-zA-Z]",data)

print (len([x for x in result if x!= '']))

好简洁的版本,结果是149,使用的“re.split”

import re

with open('test.txt','r')as f:

data = f.read()

result = re.findall(r"[^a-zA-Z]+",data)

print("the number of words in the file is: %s" % len(result))

结果是150?

import re

def get_num():

num = 0

f = open('test.txt', 'r')

for line in f.readlines():

num += len(re.findall(r'[^a-zA-Z]+', line))

f.close()

return num

if __name__ == '__main__':

print(get_num())结果是174

那么问题来了,为什么会有不同结果?更多解法 zhangslob/RE

专栏 知乎专栏 知乎专栏

资料 re,正则表达式_百度百科(匆忙中写出,可能有错误,欢迎提出)

python统计句子中单词个数_Python练习第三题,统计单词个数相关推荐

  1. [c]输入一个英文句子,统计句子中单词的个数

    #include <stdio.h> #include <stdlib.h> //输入一个英文句子,统计句子中单词的个数 void main() { char s[256],p ...

  2. C语言:统计句子中元音字母的个数

    统计句子中元音字母的个数 (30 分) 输入一个英文句子,已知:第一个字符是大写,其它字符都是小写,句子以 . 结束. 判断首字母是否为元音字母,并统计句子中元音字母(a.e.i.o.u)的个数,若首 ...

  3. 28.【C语言】键盘输入一句英文,统计句子中每个字母出现的次数(不区分大小写,一律按小写显示)(Demo)

    问题描述: 键盘输入一句英文,统计句子中每个字母出现的次数(不区分大小写,一律按小写显示) 算法思想 用一个字符数组str[ ]获取输入的整个字符串,用一个大小为26的整型数组alp[ ]用于存放统计 ...

  4. python统计句子中单词个数_python练习:一行搞定-统计一句话中每个单词出现的个数...

    原博文 2018-10-04 19:42 − 一行搞定-统计一句话中每个单词出现的个数 >>> s'i am a boy a bood boy a bad boy' 方式一:> ...

  5. python统计句子中单词个数_【python统计单词数量】作文写作问答 - 归教作文网

    如何用python统计一个txt文件中某个单词出现的次数 1.首先,定义一个变量,保存要统计的英文文章. 2.接着,定义两个数组,保存文章中的单词,以及各单词的词频. 3.从文章中分割出所有的单词,保 ...

  6. python怎么统计单词总数_Python【习题】:统计纯英文文本中总字数

    人生苦短,我用Python 环境:Windows 10 64-bit, python == 3.6.4 , PyCharm CE == 2018.1 声明:学习资源来自于网络,这里是自己学习笔记总结与 ...

  7. 统计句子中的词频 python编程

    问题描述: 题目内容: 对于一个已分词的句子(可方便地扩展到统计文件中的词频): 我/是/一个/测试/句子/,/大家/赶快/来/统计/我/吧/,/大家/赶快/来/统计/我/吧/,/大家/赶快/来/统计 ...

  8. python操作js中的输入_Python调用JavaScript代码的方法

    准备阶段: 以一段简单的JS脚本为例,将代码写入到文件中,其中,定义了一个方法,计算两个数的和. //norm.js //计算两个数的和 function add(num1, num2) { retu ...

  9. matlab 如何统计矩阵中大于、小于或等于某一值的位置、个数

    善用 find() 和 sum() 函数! 假设存在如下矩阵 a : >> a = [1,2,3;4,5,6;7,8,9] a = 1     2     3      4     5   ...

最新文章

  1. 高防服务器究竟能防御哪些攻击?
  2. 农信互联X联网副总冯兴臣:关于互农产品的一些思考
  3. Spring的常用注解,SpringMVC常用注解
  4. mybatis 做 insert操作的时候返回插入的那条数据的id
  5. string中c_str()、data()、copy(p,n)函数的用法
  6. IDEA创建包不是树形
  7. 微信收款音响s3服务器断开,微信收款音响s2和s3有什么区别
  8. hal 双串口同时接收丢失数据_【STM32Cube_06】使用USART发送和接收数据(查询模式)...
  9. IIS7 配置 PHP
  10. 连CEO都不香了?这些互联网大佬接连辞任
  11. linux使用ftp命令_如何使用Linux FTP命令
  12. WPF 元素相对另外一个元素的 相对位置
  13. 深度探索C++对象模型读书笔记(1)
  14. Java数据库学习之模糊查询(like )
  15. Windows10 快捷方式失效
  16. 基于C++编译的车牌识别系统
  17. 大白菜备份还原linux,大白菜pe手动gho镜像还原,大白菜制作ghost镜像
  18. Windows防火墙的配置与应用
  19. IOS App的生命周期
  20. 《公司的力量》纪录片

热门文章

  1. 高等数学:学习步骤(持续更新)
  2. android n进入分屏代码分析_不只是分屏多任务,Android N 的这些特性也与你有关...
  3. 个人谈谈需要找成熟稳重男生的女生
  4. Anaconda Spyder打不开的问题:Bad file descriptor
  5. 计算机设计语言常用的英语,计算机设计语言
  6. Mybatis学习之动态Sql
  7. 荣耀play 3鸿蒙,无指纹+720P卖999元,荣耀Play3被喷性价比太低,其实你们都错了...
  8. php js显示文字个数,JS实现字数统计的功能
  9. Python小数向上取整和向下取整
  10. Linux网络管理之ip命令 – 显示与操作路由