Python匹配CSV与文本内容时if语句多次触发如何解决
错误原因
- 你使用的是子串匹配规则
in,短字符串nine是ninety、ninety-nine的子串,ninety是ninety-nine的子串,三者都能匹配到样例文本中的ninety-nine,所以会触发三次if判断写入结果。 - 之前尝试的break只能跳出内层遍历文本行的循环,外层遍历CSV行的逻辑仍在执行,后续短的匹配项依然会触发写入;倒序读取CSV仅调整了写入顺序,无法阻止短匹配项的写入逻辑,因此无效。
修复方案
核心逻辑调整为:先收集每一行文本的所有匹配项,仅将最长的匹配项写入文件,避免短匹配被误写
修复后的参考代码:
import csv with open(csvfile_sample) as csvfile, open(sample_file,'r') as sample, open(new_file,'w') as new: reader = csv.DictReader(csvfile) # 先把所有待匹配的关键词存到列表里 keywords = [row['replace'] for row in reader] # 遍历每一行文本 for line in sample.readlines(): # 收集当前行的所有匹配关键词 matched = [kw for kw in keywords if kw in line] if matched: # 取最长的匹配项写入 longest_match = max(matched, key=lambda x: len(x)) new.write(longest_match)
如果需要按完整单词匹配避免子串误判(比如文本里出现ninetynine不带横杠也不会误匹配),可以用正则的单词边界匹配,修改匹配逻辑即可:
import re # 匹配部分改成 matched = [kw for kw in keywords if re.search(rf'\b{re.escape(kw)}\b', line)]
内容的提问来源于stack exchange,提问作者scripter2
相关产品推荐
相关产品推荐

