使用正则表达式从images列表筛选与masks匹配的对应元素
需求描述
我有两个文件列表:
images = ['ND_row_id_4026.png', 'ND_row_id_7693.png', 'ND_row_id_5285.png', 'ND_row_id_1045.png', 'ND_row_id_2135.png', 'ND_row_id_8155.png', 'ND_row_id_3135.png'] masks = ['MA_row_id_4026.png', 'MA_row_id_7693.png', 'MA_row_id_5285.png', 'MA_row_id_1045.png', 'MA_row_id_2135.png']
需要保留masks列表中的所有文件,同时从images列表里筛选出和masks文件ID对应的图像文件(即保留ID一致的元素),最终得到和masks数量匹配的images子集:
images = ['ND_row_id_4026.png', 'ND_row_id_7693.png', 'ND_row_id_5285.png', 'ND_row_id_1045.png', 'ND_row_id_2135.png']
要求用正则表达式实现这个筛选。
实现方案
步骤1:提取masks中的唯一ID
先用正则从每个mask文件名中提取出ID数字,把这些ID存成集合,方便后续快速匹配:
import re masks = ['MA_row_id_4026.png', 'MA_row_id_7693.png', 'MA_row_id_5285.png', 'MA_row_id_1045.png', 'MA_row_id_2135.png'] # 匹配mask文件名末尾的ID部分 mask_id_pattern = re.compile(r'_(\d+)\.png$') mask_ids = set() for mask in masks: match_result = mask_id_pattern.search(mask) if match_result: mask_ids.add(match_result.group(1))
步骤2:筛选images中对应ID的元素
再用正则匹配images中的文件名,提取ID后检查是否在已收集的mask ID集合里,符合条件的元素就保留:
images = ['ND_row_id_4026.png', 'ND_row_id_7693.png', 'ND_row_id_5285.png', 'ND_row_id_1045.png', 'ND_row_id_2135.png', 'ND_row_id_8155.png', 'ND_row_id_3135.png'] # 匹配image文件名末尾的ID部分 image_id_pattern = re.compile(r'_(\d+)\.png$') filtered_images = [] for img in images: match_result = image_id_pattern.search(img) if match_result and match_result.group(1) in mask_ids: filtered_images.append(img) print(filtered_images)
运行后输出结果即为目标列表:
['ND_row_id_4026.png', 'ND_row_id_7693.png', 'ND_row_id_5285.png', 'ND_row_id_1045.png', 'ND_row_id_2135.png']
正则表达式说明
- 正则
r'_(\d+)\.png$'的含义:_:匹配文件名中的下划线(\d+):捕获一个或多个连续数字(即我们需要的ID部分,括号用于分组提取)\.png:匹配.png后缀(点号是正则特殊字符,需用反斜杠转义)$:匹配字符串结尾,确保只匹配文件名末尾的ID,避免误匹配文件名中间的数字
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

