Python 3中如何移除文件名扩展名前的日期且保留非日期数字?
解决文件名中移除扩展名前日期并转小写的问题
你的问题出在之前的正则表达式是全局匹配所有数字、点和横杠,没有针对性地定位到「扩展名前的末尾日期」,所以误删了文件名里的其他数字(比如120),还把扩展名的点也删掉了。下面给你一个精准的解决方案:
思路拆解
- 先把每个文件名拆分为「主名称部分」和「扩展名部分」(带点),避免误改扩展名的点;
- 只针对主名称部分,匹配并移除末尾的日期格式(比如
1.4.2016或5-2-2018); - 把处理后的主名称转小写,再和扩展名拼接得到最终文件名。
完整代码实现
import re import os file_name_list = ['ABDCD Pattern Raw Data 1.4.2016.xlsx', 'Jack Raw Data 1.2.2016.xlsx', 'Farmers holdings 1.1.2016.xlsx', 'Anne Raw Data 1.3.2016.csv', '120 Brewers 5-2-2018.txt'] output_list = [] for filename in file_name_list: # 拆分主名称和扩展名(扩展名保留原有的点) name_part, ext_part = os.path.splitext(filename) # 正则匹配并移除主名称末尾的日期:空格+数字[.-]数字[.-]数字的格式 cleaned_name = re.sub(r'\s+\d+[.-]\d+[.-]\d+$', '', name_part) # 转小写后拼接扩展名 final_name = f"{cleaned_name.lower()}{ext_part}" output_list.append(final_name) print(output_list)
代码说明
os.path.splitext(filename):安全拆分文件名和扩展名,比如对于120 Brewers 5-2-2018.txt,会得到name_part='120 Brewers 5-2-2018',ext_part='.txt';- 正则
r'\s+\d+[.-]\d+[.-]\d+$':\s+:匹配日期前的一个或多个空格;\d+[.-]\d+[.-]\d+:匹配「数字+点/横杠+数字+点/横杠+数字」的日期格式;$:确保只匹配主名称末尾的日期,不会影响前面的数字(比如120);
cleaned_name.lower():把处理后的主名称转为小写,再和原扩展名拼接。
运行结果
运行后会得到你想要的输出:
['abdcd pattern raw data.xlsx', 'jack raw data.xlsx', 'farmers holdings.xlsx', 'anne raw data.csv', '120 brewers.txt']
内容的提问来源于stack exchange,提问作者user9431057
相关产品推荐
相关产品推荐

