如何实现带子句运算符的代码组合验证与数据集匹配?
特殊条件子句处理与CSV匹配实现方案
一、运算符逻辑提取步骤
核心是把条件子句拆成包含组和排除组,再处理每组内的OR选项:
- 按顶级
+拆分整个子句,得到独立的条件单元,比如示例拆分后是(100/200)、ABC、(AAA/BBB)、-(CCC/DDD) - 对每个单元做标记:
- 开头带
-的是排除单元,去掉-后,剩下的内容按/拆成多个排除项(比如CCC/DDD拆成CCC、DDD) - 不带
-的是包含单元,去掉首尾括号(如果有)后,按/拆成多个包含选项(比如100/200拆成100、200)
- 开头带
- 所有包含单元的选项做笛卡尔积,生成所有可能的包含组合;排除项则统一收集,所有组合共用同一组排除规则。
二、Python简便实现
1. 解析条件生成所有组合
用itertools.product快速生成笛卡尔积,代码示例:
import itertools def parse_condition(condition_str): # 拆分顶级+单元 units = [u.strip() for u in condition_str.split('+') if u.strip()] include_groups = [] exclude_items = [] for unit in units: if unit.startswith('-'): # 处理排除单元 exclude_part = unit[1:].strip().strip('()') exclude_items.extend(exclude_part.split('/')) else: # 处理包含单元 include_part = unit.strip().strip('()') include_groups.append(include_part.split('/')) # 生成所有包含组合 include_combinations = list(itertools.product(*include_groups)) # 整理成可读的字符串格式 result = [] for combo in include_combinations: combo_str = ' + '.join(combo) if exclude_items: combo_str += ' - ' + ' - '.join(exclude_items) result.append(combo_str) return include_combinations, exclude_items, result # 测试示例 condition = "(100/200)+ABC+(AAA/BBB)+-(CCC/DDD)" include_combos, excludes, combo_strs = parse_condition(condition) for s in combo_strs: print(f"| {s}")
运行后会输出你要的4种组合。
2. 匹配CSV数据集
用pandas读取CSV,然后对每条记录做匹配判断:
import pandas as pd def match_record(record, include_combo, excludes): # 这里假设每条记录是字符串格式,可根据CSV实际结构调整 record_str = str(record) # 检查是否包含所有组合项 include_ok = all(item in record_str for item in include_combo) # 检查是否不包含所有排除项 exclude_ok = all(item not in record_str for item in excludes) return include_ok and exclude_ok # 读取CSV df = pd.read_csv('your_data.csv') # 对每条记录,检查是否匹配任意一个组合 df['match'] = df.apply(lambda row: any(match_record(row, combo, excludes) for combo in include_combos), axis=1) # 输出匹配结果 print(df[df['match']])
如果CSV是多列结构,可调整match_record函数,针对性检查指定列的内容。
三、Excel实现方案
1. 生成所有逻辑组合
- 手动拆分条件子句:把包含组拆成单独单元格(比如包含组1填
100,200,包含组2填ABC,包含组3填AAA,BBB),排除组填CCC,DDD - 用Power Query生成笛卡尔积:导入分组数据,依次对每个包含组做“扩展到新行”操作,最后合并列得到所有包含组合,再拼接排除项生成完整条件字符串。
2. 匹配CSV数据
假设CSV数据在A列,每个组合在D列,排除项在E列(逗号分隔):
- 包含条件公式:
=SUMPRODUCT(--ISNUMBER(SEARCH(TEXTSPLIT(D1," + "),A1)))=COUNTA(TEXTSPLIT(D1," + ")) - 排除条件公式:
=SUMPRODUCT(--ISNUMBER(SEARCH(TEXTSPLIT(E1," - "),A1)))=0 - 最终匹配公式:
=AND(包含条件公式, 排除条件公式) - 下拉公式即可得到每条记录的匹配结果。
内容的提问来源于stack exchange,提问作者coderjoeR1991
相关产品推荐
相关产品推荐

