文本文件单词的检索与计数
算法
朴素模式匹配算法
Brute-Force的基本思想是:从主串S=“S(0) S1 …S(n-1)”的第pos个字符开始与子串T=“T(0) T1 …T(n-1)”的第一个字符比较,如果相等则继续比较后一个字符;否则从主串的下一字符开始与子串T的第一个字符重新开始比较,以此类推。如果在主串S中存在与子串T相等的连续字符序列,则匹配成功,函数返回子串T中第一个字符在主串S中的位置;否则,函数返回-1。简单的说,就是对主串的每一个字符作为子串的开头,与要匹配的字符串进行匹配。对主串做大循环,每个字符开头做T的长度的小循环,直到匹配成功或全部遍历完成为止。
def word_search(self):
filename, word = self.get_target()
file = self.open_file(filename, 'r')
row = 1
S=file.readline()
while True:
if S:
index_list = []
num=0#一行出现了几次
i = 0
index = None
is_exists = False#是否存在
while i<len(S):
if word == S[i:i+len(word)]:
is_exists = True
index = i+1
index_list.append(index)
i+=1
num+=1
else:
i = i+1
S=file.readline()
print('在第'+str(row)+'行出现了'+str(num)+'次'+' '+'相应位置在',end='')
for index in index_list:
print(str(index)+' ', end='')
print('')
row+=1
else:
break
KMP算法
Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置。此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符。
在python中可以实验line,count()方法来对字符串进行检索与计数
运行环境
visual studio code
运行截图
建立文件,并输入数据量大的文本
单词计数,计数目标单词一共出现的次数
单词的定位
附属全代码(稍微有点小问题,还在调试当中)
class Word_Search():
def menu(self):
print('文本文件单词的检索与计数')
print('1. 建立文件')
print('2. 单词计数')
print('3. 单词定位')
print('4. 退出程序')
print('请选择:')
choice = input()
if choice == '1':
self.create_file()
elif choice == '2':
self.word_count()
elif choice == '3':
self.word_search()
else:
print('欢迎下次使用!')
return
def show_menu(self):
choice = input('是否返回主菜单:(Y/N)')
if choice == 'Y':
self.menu()
else:
print('欢迎下次使用!')
return
def open_file(self, filename, method):
try:
file = open('/Users/Desktop' + filename + '.txt', method)#桌面所在位置
except IOError:
print('没有找到文件,请重新输入!')
self.show_menu()
else:
return file
def get_target(self):
filename = input('请输入文件名:')
word = input('请输入目标单词:')
return filename, word
def create_file(self):
filename = input('请输入文件名:')
file = self.open_file(filename, 'w')
print('请输入文件内容:')
while True:
line = input()
if line == '#':
break
else:
file.writelines(line)
file.write('\n')
file.close()
self.show_menu()
def word_count(self):
filename, word = self.get_target()
file = self.open_file(filename, 'r')
count = 0
try:
for line in file.readlines():
count += line.count(word)
print('共有 ' + str(count) + ' 个 ' + word)
self.show_menu()
except:
pass
def word_search(self):
filename, word = self.get_target()
file = self.open_file(filename, 'r')
row = 1
S=file.readline()
while True:
if S:
index_list = []
num=0#一行出现了几次
i = 0
index = None
is_exists = False#是否存在
while i<len(S):
if word == S[i:i+len(word)]:
is_exists = True
index = i+1
index_list.append(index)
i+=1
num+=1
else:
i = i+1
S=file.readline()
print('在第'+str(row)+'行出现了'+str(num)+'次'+' '+'相应位置在',end='')
for index in index_list:
print(str(index)+' ', end='')
print('')
row+=1
else:
break
wordsearch = Word_Search()
wordsearch.menu()