You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:46:40