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

如何使用正则表达式在文件中搜索多字符串并分别统计各出现次数

多行多目标字符串统计问题解决方案

问题描述

需要在文件每一行中查找一个或多个目标字符串,统计每个字符串在整个文件中的总出现次数。部分行仅包含一个目标字符串,部分行可能包含多个。

现有代码仅能统计每行第一个匹配项,无法处理一行多匹配的情况;尝试使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:53:29