Python:如何实现列表元素与另一列表行的部分匹配
解决方案
方法一:直接子串包含判断
这是最直接高效的方式,无需额外依赖,直接检查字符串中是否包含目标子串即可。
- 处理jobs列表,生成目标子串:
jobs = [ 'P01_TEST1_C', 'P01_TEST3_B', 'P01_TEST5_F', 'P01_QUALITY_C' ] # 提取每个job去掉前3个字符后的子串 target_substrings = [job[3:] for job in jobs]
- 遍历data列表,筛选符合条件的行:
data = [ ['JOB','X01_TEST1_C', 'NAME', 'DATE', 'EXTRADATA'], ['JOB','P01_TEST3_C', 'NAME', 'DATE', 'EXTRADATA'], ['JOB','X01_TEST1002_C', 'NAME', 'DATE', 'EXTRADATA'], ['JOB','X01_TEST4231_C', 'NAME', 'DATE', 'EXTRAP01_TEST5_FDATA'] ] matched_rows = [] for row in data: # 检查当前行的任意元素是否包含目标子串 for element in row: if any(substring in element for substring in target_substrings): matched_rows.append(row) break # 找到匹配后跳出,避免重复添加 # 输出匹配结果 for row in matched_rows: print(row)
运行结果:
['JOB', 'X01_TEST1_C', 'NAME', 'DATE', 'EXTRADATA'] ['JOB', 'X01_TEST4231_C', 'NAME', 'DATE', 'EXTRAP01_TEST5_FDATA']
注:原data中的第二行
['JOB','P01_TEST3_C', ...]不包含目标子串_TEST3_B,所以未被匹配;如果是笔误将P01_TEST3_C改为P01_TEST3_B,该行会被成功匹配。
方法二:使用通配符匹配(fnmatch库)
如果后续需要更灵活的匹配规则(比如限制开头/结尾),可以用Python内置的fnmatch库实现通配符匹配。
- 生成通配符模式:
import fnmatch jobs = [ 'P01_TEST1_C', 'P01_TEST3_B', 'P01_TEST5_F', 'P01_QUALITY_C' ] # 生成包含目标子串的通配符模式(*表示任意字符) target_patterns = [f"*{job[3:]}*" for job in jobs]
- 筛选匹配行:
data = [ ['JOB','X01_TEST1_C', 'NAME', 'DATE', 'EXTRADATA'], ['JOB','P01_TEST3_C', 'NAME', 'DATE', 'EXTRADATA'], ['JOB','X01_TEST1002_C', 'NAME', 'DATE', 'EXTRADATA'], ['JOB','X01_TEST4231_C', 'NAME', 'DATE', 'EXTRAP01_TEST5_FDATA'] ] matched_rows = [] for row in data: for element in row: if any(fnmatch.fnmatch(element, pattern) for pattern in target_patterns): matched_rows.append(row) break # 输出结果 for row in matched_rows: print(row)
该方法效果与子串判断一致,但通配符模式支持更多扩展规则,比如TEST*C可匹配以TEST开头、C结尾的字符串。
内容的提问来源于stack exchange,提问作者Demo
相关产品推荐
相关产品推荐

