如何基于_xxkg字符串匹配对两个文件路径列表分组?
问题描述
我有如下两个文件路径列表:
L3 = ['D://carrot_25kg', 'D://banana_5kg', 'D://apple_50kg'] L4 = ['D://box3_5kg-mark', 'D://box1_25kg-dan', 'D://box2_50kg-jack']
需要将文件按如下形式分组:
result = [['D://carrot_25kg', 'D://box1_25kg-dan'], ['D://banana_5kg', 'D://box3_5kg-mark'], ['D://apple_50kg', 'D://box2_50kg-jack']] #顺序无关
匹配规则为基于“_xxkg”字符串。我尝试了以下代码:
from collections import defaultdict from itertools import chain d = defaultdict(list) for path in chain(L3, L4): suffix = path.split('_')[-1] d[suffix].append(path)
但得到的结果不符合预期:
defaultdict(<class 'list'>, {'25kg': ['D://carrot_25kg'], '5kg': ['D://banana_5kg'], '50kg': ['D://apple_50kg'], '5kg-mark': ['D://box3_5kg-mark'], '25kg-dan': ['D://box1_25kg-dan'], '50kg-jack': ['D://box2_50kg-jack']})
请问该如何实现需求?
解决方案
之前的代码问题在于,拆分后缀时直接取了split('_')[-1],但对于L4里的路径,这会把5kg-mark这类带额外后缀的字符串全部当成键,导致和L3里的5kg无法匹配。
正确的做法是提取出路径中_xxkg的核心标识,以下是两种可行的实现方式:
方法1:字符串切片定位
通过查找kg和对应下划线的位置,精准提取匹配键:
from collections import defaultdict from itertools import chain d = defaultdict(list) for path in chain(L3, L4): # 找到'kg'的结束位置 kg_end = path.find('kg') + 2 # 从kg结束位置往前找最近的下划线 underscore_pos = path.rfind('_', 0, kg_end) # 提取_xxkg作为分组键 key = path[underscore_pos:kg_end] d[key].append(path) # 将字典值转为列表得到结果 result = list(d.values())
方法2:正则表达式匹配
用正则匹配_\d+kg模式,更灵活适配数字长度变化:
import re from collections import defaultdict from itertools import chain # 匹配下划线+数字+kg的模式 pattern = re.compile(r'_\d+kg') d = defaultdict(list) for path in chain(L3, L4): match = pattern.search(path) if match: key = match.group() d[key].append(path) result = list(d.values())
两种方法都能得到预期的分组结果,输出示例:
[['D://carrot_25kg', 'D://box1_25kg-dan'], ['D://banana_5kg', 'D://box3_5kg-mark'], ['D://apple_50kg', 'D://box2_50kg-jack']]
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

