Python新手求助:列表正则过滤后分隔符处理及文件名提取
解决提取文件名的问题
嗨,别担心,作为Python新手遇到这类字符串处理问题太正常啦😉。咱们一步步来搞定这个提取文件名的需求:
首先看你的原始数据,每个列表元素是带换行符的字典格式字符串,比如:"{'0_HONOR_1524204351030': 'NEW'}\n"。你之前用split(":")[0]得到的结果带着{',是因为split只按冒号分割了前面部分,还没处理掉多余的大括号和单引号。
这里给你两种简单可靠的解决方法:
方法一:用正则表达式精准匹配文件名
正则可以直接定位你想要的文件名格式(数字+下划线+HONOR+下划线+数字的组合),一步提取目标内容:
import re # 你的原始列表 listoffiles = ["{'0_HONOR_1524204351030': 'NEW'}\n", "{'0_HONOR_1524204351030': 'NEW'}\n"] # 列表推导式+正则提取 filenames = [re.search(r'(\d+_HONOR_\d+)', item).group(1) for item in listoffiles] print(filenames) # 输出:['0_HONOR_1524204351030', '0_HONOR_1524204351030']
解释:r'(\d+_HONOR_\d+)'这个正则规则,专门匹配「一个或多个数字 + 下划线 + HONOR + 下划线 + 一个或多个数字」的内容,刚好完全对应你的文件名格式。
方法二:把字符串转成真实字典再取键
因为你的每个元素本质是字典的字符串形式,咱们可以用ast.literal_eval把它转成实际的字典,然后直接取键——这种方法更通用,哪怕以后文件名格式变化,只要字典结构不变就能用:
import ast # 你的原始列表 listoffiles = ["{'0_HONOR_1524204351030': 'NEW'}\n", "{'0_HONOR_1524204351030': 'NEW'}\n"] # 处理每个元素:先去换行符,转字典,再取第一个键 filenames = [list(ast.literal_eval(item.strip()).keys())[0] for item in listoffiles] print(filenames) # 输出:['0_HONOR_1524204351030', '0_HONOR_1524204351030']
解释:
item.strip():去掉字符串两端的换行符和空白字符ast.literal_eval(item.strip()):把字符串转成真实字典(比eval()更安全,不会执行恶意代码)list(...keys())[0]:取出字典的所有键,转成列表后取第一个(因为你的每个字典只有一个键)
如果文件名格式固定,方法一更高效;如果以后可能有多个键或字典结构变化,方法二更灵活。
内容的提问来源于stack exchange,提问作者Krishangi Goswami
相关产品推荐
相关产品推荐

