Python中如何修复正则匹配文件内容的结果显示格式?
解决方法:统计单词出现次数并格式化输出
我明白你想把原来逐行零散输出匹配结果的逻辑,改成统计目标单词总出现次数+汇总展示所有出现行号的格式,这就帮你调整代码:
首先我们需要先收集两个核心信息:目标单词在文件里的总出现次数,以及所有包含该单词的行号列表,再用这两个信息生成你想要的输出样式。以下是修改后的完整代码片段:
import re def searchWord(self, selectedFile): fileToSearchInside = self.readFile(selectedFile) searchedSTR = self.lineEditSearch.text().strip() # 去除首尾空格,避免无效搜索 textList = fileToSearchInside.split('\n') total_count = 0 line_numbers = [] # 用enumerate直接获取从1开始的行号,替代手动维护counter for line_idx, myLine in enumerate(textList, start=1): # 转义目标单词里的正则特殊字符,确保匹配准确;\b保证匹配完整单词 pattern = re.compile(r'\b' + re.escape(searchedSTR) + r'\b', re.IGNORECASE) matches = pattern.findall(myLine) if matches: total_count += len(matches) line_numbers.append(str(line_idx)) # 转成字符串方便后续拼接 # 生成最终输出格式 if total_count > 0: line_part = ' '.join([f'on line {num}' for num in line_numbers]) output = f"{searchedSTR.lower()} exist {total_count} times {line_part}" print(output) # 这里可以替换成你需要的UI展示逻辑 else: print(f"{searchedSTR.lower()} does not exist in the file")
关键调整说明:
- 用
enumerate(textList, start=1)直接获取从1开始的行号,比手动维护counter更简洁不易出错 - 加入
re.escape(searchedSTR)转义目标单词中的特殊字符(比如.、*这类正则元字符),避免匹配逻辑出错 - 用
\b单词边界确保匹配完整单词(比如搜"if"不会误匹配"iff"),不需要的话可以去掉 - 统计每行的匹配数量并累加到总次数,同时收集所有出现匹配的行号
- 最后通过字符串拼接生成你想要的格式:
[单词] exist [次数] times on line X on line Y... - 加入了大小写不敏感匹配(
re.IGNORECASE),需要严格大小写的话可以移除这个参数
举个实际效果例子:如果"if"在第1行出现1次、第2行出现1次,输出就是:
if exist 2 times on line 1 on line 2
内容的提问来源于stack exchange,提问作者Pyt Leb
相关产品推荐
相关产品推荐

