如何使用正则表达式获取Python字典各键对应列表中b后最大数字的文件名
解决字典中文件名“b”后四位数字最大值的问题
你遇到的核心问题是正则匹配范围不对,而且循环遍历字典的方式有误,我来帮你修正并给出可行的解决方案。
首先,你的原始代码有两个明显问题:
- 遍历字典时应该用
my_dict.items(),否则直接遍历my_dict只会拿到键,无法获取对应的文件列表; - 用
re.findall('\d+', string)会匹配字符串中所有数字,包括文件名开头的编号,这不是你要的目标。
针对需求,我们需要精准匹配字母"b"之后的四位数字,然后基于这个数字的大小找到对应的文件名。以下是完整的解决方案:
完整代码实现
import re # 你的原始字典 my_dict = { "['000A']": ['1653418_a0001b001.jpg', '2132018_a0002b002.jpg', '4789562_a0001b003.jpg', '8469844_a0009b004.jpg', '4815099_a0004b000.jpg', '9085654_a0001b001.jpg', '9742212_a0007b002.jpg', '1325874_a0002b009.jpg', '1474856_a0090f014.jpg'], "['000B']": ['1653418_a0001b001.jpg', '2132018_a0002b002.jpg', '4789562_a0001b003.jpg', '8469844_a0009b004.jpg', '4815099_a0004b000.jpg', '9085654_a0001b001.jpg', '9742212_a0007b002.jpg', '1325874_a0002b009.jpg', '123456_a0090f020.jpg'] } result_dict = {} for key, file_list in my_dict.items(): # 用max函数结合自定义key,找到b后数字最大的文件 target_file = max( file_list, key=lambda filename: int(re.search(r'b(\d{4})', filename).group(1)) ) result_dict[key] = target_file print(result_dict)
代码说明
- 正则匹配逻辑:
r'b(\d{4})'是关键,它会精准匹配字符串中b后面紧跟的4位数字,括号()用来捕获这个数字组,方便后续提取。 - 遍历字典:
my_dict.items()能同时获取每个键和对应的文件列表,这是遍历字典键值对的正确方式。 - max函数的key参数:通过lambda表达式,把每个文件名转换成对应的
b后四位数字的整数,max会基于这个整数的大小找到对应的文件名。
容错优化(可选)
如果你的文件列表中存在不符合b+四位数字格式的文件,可以添加判断避免报错:
target_file = max( file_list, key=lambda filename: int(re.search(r'b(\d{4})', filename).group(1)) if re.search(r'b(\d{4})', filename) else 0 )
这样即使遇到不符合格式的文件,也会默认用0作为比较值,不会抛出异常。
运行上述代码后,就能得到你预期的结果:
{"['000A']": '1474856_a0090f014.jpg', "['000B']": '123456_a0090f020.jpg'}
内容的提问来源于stack exchange,提问作者Art
相关产品推荐
相关产品推荐

