如何将子进程输出的文件列表拆分为可直接访问的列表/元组?
解决嵌套列表问题:从子进程输出拆分文件信息
嘿,我来帮你搞定这个嵌套列表的问题!
你现在遇到的问题根源在于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
相关产品推荐
相关产品推荐

