You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将子进程输出的文件列表拆分为可直接访问的列表/元组?

解决嵌套列表问题:从子进程输出拆分文件信息

嘿,我来帮你搞定这个嵌套列表的问题!

你现在遇到的问题根源在于re.findall的行为:它会返回所有匹配到的结果组成的列表,哪怕每个输入字符串只有一组符合正则的内容,也会把这组结果包裹在一个小列表里,所以才会出现[('1582120598', '672', '/Users/user/Desktop/')]这种嵌套结构,导致你得用new_list[0][0]才能访问第一个元素。

这里有两个简单的解决方法,任选其一就行:

方法1:用re.search替代re.findall

re.search会返回第一个匹配的对象,调用它的.groups()方法就能直接拿到包含三个元素的元组,不会产生嵌套:

import re

copy_list = [ 
    '1582120598 672 /Users/user/Desktop/', 
    '1581847900 64 /Users/user/Desktop//untitled folder', 
    '1581842714 352 /Users/user/Desktop//RECEIPTS', 
    '1581686620 433097 /Users/user/Desktop//RECEIPTS/cameringo_20200214_132341.jpg' 
]

new_list = list(map(lambda x: re.search(r'(\d+)\s(\d+)\s(.*)', x).groups(), copy_list))

这样new_list的结构就是扁平的列表:

[
    ('1582120598', '672', '/Users/user/Desktop/'),
    ('1581847900', '64', '/Users/user/Desktop//untitled folder'),
    ...
]

现在你直接用new_list[0][0]就能拿到第一个时间戳,new_list[0]就能获取整条记录的元组。

方法2:保留re.findall但提取子列表的第一个元素

如果你坚持要用findall,可以在map的lambda表达式里直接取每个匹配结果列表的第一个元素(因为你的每个输入字符串只会有一组匹配):

new_list = list(map(lambda x: re.findall(r'(\d+)\s(\d+)\s(.*)', x)[0], copy_list))

这个写法也能去掉嵌套的那一层,得到和方法1一样的扁平结构。

额外提示:处理可能的匹配失败

如果你的输入列表里可能存在不符合格式的字符串(比如没有匹配到三组内容),可以加个判断避免索引错误:

def parse_entry(entry):
    match = re.search(r'(\d+)\s(\d+)\s(.*)', entry)
    return match.groups() if match else ()

new_list = list(map(parse_entry, copy_list))

这样即使有匹配失败的条目,也只会返回空元组,不会抛出异常。

内容的提问来源于stack exchange,提问作者Chris Barrett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:32:27