Python统计文本中字符串出现行内次数的结果异常问题排查
问题分析与修复方案
我来帮你梳理下代码里的问题,以及对应的修复方法~
核心问题:行数统计的逻辑漏洞
你代码里统计行数的if word in line:是字符串包含判断,而不是精确的单词匹配。举个例子:
- 搜索
Berlin时,文本里的Berliner字符串包含Berlin,这一行会被误算入行数; - 搜索
Paris时,Parisian里也包含Paris,同样会被错误统计。
这就是为什么Berlin的行数显示4(实际应该是3)、Paris行数显示3(实际应该是2)的原因。
另外还有个小细节:最后一行的f.close少了括号,应该写成f.close(),虽然不影响当前统计,但规范上要补上。
修复后的代码
方案一:基于单词分割的精确匹配
这个方案简单直接,和你原来的代码逻辑衔接紧密,先把每行分割成单词,再判断目标单词是否在其中:
f = open('CountOccurrences.txt') word = input("Enter word to be looked for : ") oc = 0 li = 0 for line in f: words = line.split() # 先检查当前行是否存在精确匹配的单词 if word in words: li += 1 # 统计总出现次数 for i in words: if i == word: oc += 1 print(f'Considering that this search is case-sensitive, there are {oc} occurrence(s) of the word, in {li} line(s)') f.close()
方案二:用正则匹配完整单词(更健壮)
如果文本里可能出现带标点的单词(比如Berlin,这种情况),用正则表达式匹配完整单词会更准确,避免误判:
import re f = open('CountOccurrences.txt') word = input("Enter word to be looked for : ") oc = 0 li = 0 # 用\b匹配单词边界,re.escape处理特殊字符 pattern = re.compile(rf'\b{re.escape(word)}\b') for line in f: # 找到当前行所有匹配的单词 matches = pattern.findall(line) if matches: li += 1 oc += len(matches) print(f'Considering that this search is case-sensitive, there are {oc} occurrence(s) of the word, in {li} line(s)') f.close()
验证结果
修复后再统计的话:
- Berlin:4次,3行(正确,Berliner所在行不再被计入)
- Paris:2次,2行(正确,Parisian所在行不再被计入)
其他单词的统计结果也会和预期一致啦~
内容的提问来源于stack exchange,提问作者ThG
相关产品推荐
相关产品推荐

