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

如何在CSV搜索词中使用通配符匹配文本文件词汇变体?

如何在CSV搜索词中使用通配符匹配词汇变体

当然可以实现。你当前用的line.find(term)是精确字符串匹配,要支持test*这类通配符匹配词汇变体,需要把CSV里的通配符转换成正则表达式,用正则匹配替代原有的查找逻辑。

具体实现步骤

1. 转换通配符为正则规则

CSV里的*是前缀/后缀通配符,对应正则里的\w*(匹配任意数量的字母、数字、下划线,适合词汇变体),同时建议加上单词边界\b,避免匹配到包含目标词的无关词汇(比如防止test*匹配attest)。

转换规则示例:

  • CSV中的test* → 正则\btest\w*\b(匹配以test开头的完整单词)
  • CSV中的*test → 正则\b\w*test\b(匹配以test结尾的完整单词)

2. 修改代码关键部分

首先导入正则模块re,然后调整搜索和匹配逻辑:

处理搜索词,转换为正则对象

import re
import glob
import time
import csv
import os
import pandas as pd

def main():
    txt_filepaths = glob.glob("**/*.txt", recursive=True)
    start = time.time()
    results = {}
    new_results = []
    term_filename = open('contract_search_terms.csv', 'r')
    term_file = csv.DictReader(term_filename)
    search_terms =[]
    
    # 转换CSV中的通配符为正则表达式
    for col in term_file:
        raw_term = col['Contract Terms']
        # 把*替换为正则的\w*,添加单词边界
        regex_pattern = raw_term.replace('*', r'\w*')
        regex_pattern = fr'\b{regex_pattern}\b'
        # 编译正则并加入列表,可选忽略大小写
        search_terms.append(re.compile(regex_pattern, re.IGNORECASE))
    
    print([r.pattern for r in search_terms]) # 检查转换后的正则规则

替换匹配逻辑,修复行号获取问题

for filepath in txt_filepaths:
        print(f"Searching document {filepath}")
        filename = os.path.basename(filepath)
        
        # 直接按行读取文件,用enumerate获取准确行号
        with open(filepath, "r", encoding="utf-8") as fp:
            for line_num, line in enumerate(fp, start=1): # 行号从1开始更符合阅读习惯
                line_content = line.strip()
                if not line_content:
                    continue
                # 遍历所有正则规则匹配当前行
                for regex in search_terms:
                    if regex.search(line_content):
                        # 还原成原始搜索词格式(去掉正则符号)
                        original_term = regex.pattern.replace(r'\b', '').replace(r'\w*', '*')
                        print(f"Found '{original_term}' in document '{filename}' in line {line_num}")
                        new_results.append({
                            'Term': original_term,
                            'Filename': filename,
                            'Line Content': line_content,
                            'Line Number': line_num
                        })
    
    # 最后统一写入CSV,提升IO效率
    d2 = pd.DataFrame(new_results)
    d2.to_csv('results.csv', index=False)
    print(f"Done! Time taken: {time.time() - start:.2f}s")

if __name__ == "__main__":
    main()

修复原代码的其他问题

  • 原代码中lines = str(fp.readlines()).split('.')会把列表转成带[]和引号的字符串,导致匹配逻辑混乱,改成直接按行读取更合理。
  • 原代码每次循环都写入CSV,IO效率极低,改成最后统一写入。
  • 原代码用lines.index(line)获取行号,会返回重复行的第一个索引,用enumerate可以准确获取当前行的真实行号。

内容的提问来源于stack exchange,提问作者Monica Nugent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:15:40