如何使用正则表达式在文件中搜索多字符串并分别统计各出现次数
多行多目标字符串统计问题解决方案
问题描述
需要在文件每一行中查找一个或多个目标字符串,统计每个字符串在整个文件中的总出现次数。部分行仅包含一个目标字符串,部分行可能包含多个。
现有代码仅能统计每行第一个匹配项,无法处理一行多匹配的情况;尝试使用re.findall但因返回数组索引不固定,不知道如何可靠统计每个单词的匹配次数:
count1 = 0 count2 = 0 count3 = 0 pattern = r'(?i)(\bString1\b)|(\bString2\b)|(\bString3\b)' i = 0 while i != len(lines): match = re.search(pattern, lines[i]) if match: if match.group(1): count1 += 1 elif match.group(2): count2 += 1 elif match.group(3): count3 += 1 i += 1
解决方案
方法1:使用re.finditer遍历所有匹配项
re.finditer会返回当前行所有匹配结果的迭代器,逐个遍历即可统计所有匹配次数:
import re count1 = 0 count2 = 0 count3 = 0 pattern = r'(?i)(\bString1\b)|(\bString2\b)|(\bString3\b)' for line in lines: # 遍历当前行的每一个匹配结果 for match in re.finditer(pattern, line): if match.group(1): count1 += 1 elif match.group(2): count2 += 1 elif match.group(3): count3 += 1 print(f"String1出现次数: {count1}") print(f"String2出现次数: {count2}") print(f"String3出现次数: {count3}")
方法2:用字典统计(推荐,更灵活)
如果目标字符串数量较多,用字典可以避免大量if-elif判断,维护更便捷:
import re # 定义目标字符串及初始计数 target_words = {'String1': 0, 'String2': 0, 'String3': 0} # 动态构造正则表达式,包含所有目标字符串,忽略大小写+单词边界 pattern = re.compile(r'(?i)\b(' + '|'.join(target_words.keys()) + r')\b') for line in lines: # 获取当前行所有匹配的目标字符串 matches = pattern.findall(line) for match in matches: # 统一转小写匹配字典键(因正则忽略大小写) target_words[match.lower()] += 1 # 输出统计结果 for word, count in target_words.items(): print(f"{word}出现次数: {count}")
关键说明
- 原代码使用
re.search仅返回第一个匹配项,因此会漏统计同行内的其他匹配 re.finditer适合需要获取匹配对象(如位置、分组信息)的场景,re.findall适合直接获取匹配内容的场景- 正则中的
(?i)表示忽略大小写,\b是单词边界,可避免匹配到包含目标字符串的更长单词(如防止把String1abc误统计为String1)
内容的提问来源于stack exchange,提问作者Clairlyagenius
相关产品推荐
相关产品推荐

