Python文本文件子串匹配代码行号输出错误,求问题排查
排查子串匹配代码的行号输出错误问题
你的代码出现错误行号输出,主要是这几个逻辑问题:
count1的累加逻辑错误:count1在每个行内只初始化一次,但在匹配子串的过程中,部分匹配的字符计数会被保留到下一次匹配尝试中。比如某行里第一个匹配位置只成功匹配了2个字符,count1变成2,下一个匹配位置只要再匹配1个字符,count1就会达到子串长度,错误触发打印。
打印时机错误:你在逐个字符匹配的循环里判断count1是否等于子串长度,这会导致还没完成整个子串匹配就提前触发打印。比如子串长度为3,当匹配到第3个字符时就打印,但如果后续字符不匹配(其实不会,因为j循环会break,但前面的count1累加问题会导致错误),或者当多次部分匹配的计数累加后错误触发。
未正确利用match1标记:你已经定义了match1来标记是否完全匹配,但没有在整个子串匹配完成后用它来判断是否打印,反而依赖容易出错的count1计数。
另外还有一个小细节:range(1,len(str1),1)里的步长1可以省略,写成range(1, len(str1))即可,不影响功能但更简洁。
修正后的代码
line_num = 0 # 假设你已提前初始化该变量 str1 = "目标子串" # 替换为你的目标子串 for myline in myfile: line_num += 1 len_str1 = len(str1) len_myline = len(myline) # 子串比当前行还长,直接跳过匹配 if len_str1 > len_myline: continue for i in range(len_myline - len_str1 + 1): if str1[0] == myline[i]: match1 = True for j in range(1, len_str1): if str1[j] != myline[i+j]: match1 = False break # 确认整个子串匹配完成后再打印行号 if match1: print(line_num) # 若一行中只需打印一次行号,可在此处添加break跳出循环 # break
关键修正说明
- 移除了count1计数逻辑,改用
match1标记判断是否完成整个子串匹配,确保只有完全匹配时才打印行号。 - 增加了子串长度校验,避免子串比当前行还长时进入无效循环。
- 调整打印时机到整个子串匹配完成后,彻底避免部分匹配导致的错误输出。
内容的提问来源于stack exchange,提问作者Priyansh Mehta
相关产品推荐
相关产品推荐

