1. 程式人生 > >python練習冊0004題

python練習冊0004題

在任意一個英文文件中,統計單詞出現的次數,

分析:

本題不是很難,單詞通常以空格隔開,但是有些單詞後面跟一些特殊符號,只需把這些特殊符號替換掉就可以了,

程式碼一

 1 import re
 2 
 3 file_name = 'code.txt'
 4 
 5 lines_count = 0
 6 words_count = 0
 7 chars_count = 0
 8 words_dict = {}
 9 lines_list = []
10 
11 with open(file_name, 'r') as f:
12     for line in f:
13         lines_count = lines_count + 1
14
chars_count = chars_count + len(line) 15 match = re.findall(r'[^a-zA-Z0-9]+', line) 16 17 #正則 re.findall 的簡單用法(返回string中所有與pattern相匹配的全部字串,返回形式為陣列)語法: 18 for i in match: 19 # 只要英文單詞,刪掉其他字元 20 line = line.replace(i, ' ') 21 lines_list = line.split()
22 for i in lines_list: 23 if i not in words_dict: 24 words_dict[i] = 1 25 else: 26 words_dict[i] = words_dict[i] + 1 27 28 print('words_count is', len(words_dict)) 29 print('lines_count is', lines_count) 30 print('chars_count is', chars_count)
31 32 for k, v in words_dict.items(): 33 print( k, v)

該程式碼有些囉嗦,網上找的,說下思路把,利用正則表示式找到所有的不是字母也不是數字的資料儲存下來,然後再訪問文字中的資料,將非字母和數字的資料替換為空

弱弱的說一句,直接替換掉不就完了。

程式碼二:

這是本人所寫的,較程式碼一稍微簡潔些;

import  re
f=open("code.txt",'r')
s=f.read()
s.replace("[^a-zA-Z]",' ')
s=s.split()
word={}
for i in s:
    if i not in  word:
        word[i]=1
    else:
        word[i]=word[i]+1
for k,v in word.items():
    print(k,v)

程式碼三:

你以為你寫的夠簡潔了嗎?不,python早就幫你封裝好函數了。

點開才能看。

import collections
import re
 
def calwords(path):
    word = []
    with open(path) as file:
        data = file.readlines()
    for line in data:
        word += re.split(' |,',line.strip('\n'))
    print(collections.Counter(word))
 
 
if __name__ == '__main__':
    calwords('e://code.txt')
View Code

用到的方法說明

正則 re.findall  的簡單用法(返回string中所有與pattern相匹配的全部字串,返回形式為陣列)
語法:findall(pattern, string, flags=0)

string的replace方法,用後一個引數替換字串中的前一個引數。
string.split方法
str.split()

單一分隔符,使用str.split()即可 

str.split不支援正則及多個切割符號,不感知空格的數量

re.split()

 多個分隔符,複雜的分隔情況,使用re.split

原型: re.split(pattern, string, maxsplit=0)

通過正則表示式將字串分離。如果用括號將正則表示式括起來,那麼匹配的字串也會被列入到list中返回。maxsplit是分離的次數,maxsplit=1分離一次,預設為0,不限制次數。

eg:

>>>a='w w w'

>>>import re

1.空格分

>>>re.split(r'[\s]',a)

['w','w','w']

2.只分割一次

>>>re.split(r'[\s]',a,1)

['w','ww']

3.多個字元分割

>>>c='[email protected]%w^w'

>>>re.split(r'[[email protected]%^],c)

['w','w','w','w','w']

4.還原?:

>>>re.split(r'(?:[email protected]%^),c)

['[email protected]%w^w']

 
描述
Python strip() 方法用於移除字串頭尾指定的字元(預設為空格或換行符)或字元序列。

注意:該方法只能刪除開頭或是結尾的字元,不能刪除中間部分的字元。
couter 是一個容器,可以統計列表中元素的出現次數.