统计一个文本的字符、单词数
文本操作是最常见的,以例子的形式来驱动程序的编写
例一:统计一篇文章或计算机文件里的字符或单词数
#-*-encoding:utf-8-*- import time keep = {'a','b','c','d','e','f','g','h','i','j','k', 'l','m','n','o','p','q','r','s','t','u','v', 'w','x','y','z',' ','-',"'"} def normalize(s): #大写转换成小写,并且剔除数字等开头或不在列表中的字符,返回正常字符串 result = '' for c in s.lower(): if c in keep: result +=c return result def make_freq_dict(s): #计算频率次数,将字符串转化成次数字典 s = normalize(s) words = s.split() d = {} for w in words: if w in d: d[w] +=1 else: d[w] = 1 return d def print_file_stats(fname): s = open(fname,'r').read() num_chars = len(s) num_lines = s.count('\n') d = make_freq_dict(s) #一层一层往上调用函数 num_words = sum(d[w] for w in d) lst = [(d[w],w) for w in d] lst.sort() lst.reverse() print("The file '%s' has: " % fname) print(" %s characters " % num_chars) print(" %s lines " % num_lines) print(" %s words" % num_words) print("\nThe top 10 most frequent words are:") i=1 for count,word in lst[:10]:#将字典转换成元组 print('%2s. %4s个 %s' % (i,count,word)) i +=1 def main(): start = time.time() print_file_stats('bill.txt') end = time.time() use = end - start print('一共花了%s 秒的时间' % use) if __name__=='__main__': main()
以上为未使用正则表达式的版本
例二:针对之前写的C语言版本,统计单词数
#include "stdio.h" int count_word(char *str); void main() { char str1[80]; int sum=0; puts("please enter a string"); gets(str1); sum=count_word(str1); //返回的count就是sum printf("there are %d words in this sentence",sum); } int count_word(char *str) { int count,flag; char *p; count=0; flag=0; p=str; while(*p!='\0')/*当字符串没有到结尾的时候,重头到尾的循环*/ { if(*p==' ')/*假如字符串遇到空格,就将flag清零,同时可以过滤掉多余的空格*/ flag=0; else if(flag==0)/*当字符串不是空格时,假如flag为0,那么计算器加1,既是遇到空格后的第一个字符时*/ { flag=1;/*将flag标记回1,这样在遇到第一个字符后的字符时可以将他过滤掉,直到遇到空格时,在清零*/ count++; //count就是统计单词数的变量。其实就是单词数的第一个字符,后面的字符都没有统计了 } p++; // 这里是抛开上面的flag=0,继续加一。没有遇到空格的时候 。直到继续遇到空格或结尾的时候,才不加一了。 } return count; }