在文件扩展名前删除文件名中的日期

4
我有一个文件名列表,其中包含不同的扩展名。
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']

我希望能够从这些文件名中仅删除日期并将它们添加到新列表中。就像这样:

['abdcd pattern raw data.xlsx',
 'jack raw data.xlsx',
 'farmers holdings.xlsx',
 'anne raw data.csv',
 '120 brewers.txt']

我使用这个帖子尝试了以下方法,我把数字去掉了,但是不是我想要的。

import re
OutputList = []
for i in file_name_list:
    lower_character = i.lower()
    OutputList.append(re.sub('[0-9.-]', '', lower_character))

输出,

['abdcd pattern raw data xlsx',
 'jack raw data xlsx',
 'farmers holdings xlsx',
 'anne raw data csv',
 ' brewers txt']

如果您仔细观察,它从“120 Brewers”中取了“120”。我该如何实现我想要的?我正在使用“Python 3”。有任何建议都可以。

我们可以假设日期都是以X.X.X或X-X-X格式(或任何点和破折号的组合)吗? - Guillaume Ruchot
可能会有很多边角情况...是否有以数字结尾的公司名称,例如brewers 120 5-2-2018.txt?日期是否总是出现在扩展名之前的末尾? - user
@Guillaume Ruchot,这是两者的结合。 - user9431057
@user 很好的问题,是的,在名称后面也可以有数字。实际上,如果我能在扩展名之前找到以'.'或'-'格式表示的日期,那就太好了。 - user9431057
4个回答

3

正则表达式:

\s\d{1,2}(\.|\-)\d{1,2}\1\d{4}

演示


这个不知道为什么对我不起作用,是我漏掉了什么还是因为它只适用于 Python 2.7?相反地,这段代码有效:\s\d{1,2}[\.-]\d{1,2}[\.-]\d{4} - user9431057
不确定...使用\1是为了确保在月份和日期之间使用的日期分隔符也用于日期和年份之间。尝试更改为\s\d{1,2}(?:\.|\-)\d{1,2}(?:\.|\-)\d{4} - Matt.G

1
import re

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']

for file in file_name_list:
   replaced = re.sub('\s\d{1,2}[\.-]\d{1,2}[\.-]\d{4}', '', file)
   print(replaced)

输出:

ABDCD Pattern Raw Data.xlsx
Jack Raw Data.xlsx
Farmers holdings.xlsx
Anne Raw Data.csv
120 Brewers.txt

1
如果你也想保留日期,你需要使用re.split()而不是删除字符串的re.sub()
你可以按照以下方式基于字符串中最后一个空格或点进行分割:
In [59]: for x in file_name_list:
    ...:     a, date , c = re.split(r'(?=(?:(?:\.[^.]*| [^ ]*))$)', x)
    ...:     se.append(a + c)
    ...:     dates.append(date.strip())
    ...:     
    ...:     

In [60]: se
Out[60]: 
['ABDCD Pattern Raw Data.xlsx',
 'Jack Raw Data.xlsx',
 'Farmers holdings.xlsx',
 'Anne Raw Data.csv',
 '120 Brewers.txt']

In [61]: dates
Out[61]: ['1.4.2016', '1.2.2016', '1.1.2016', '1.3.2016', '5-2-2018']

如果您只想删除日期,可以这样做:

And if you just wanna remove the dates

In [65]: [re.sub(r' (?:\d+[.-]){2}\d+','', x) for x in file_name_list]
Out[65]: 
['ABDCD Pattern Raw Data.xlsx',
 'Jack Raw Data.xlsx',
 'Farmers holdings.xlsx',
 'Anne Raw Data.csv',
 '120 Brewers.txt']

1
优雅的解决方案! - user9431057

0
替换操作也把点号移除了,所以文件不再具有扩展名。我注意到日期的格式不一,这并不方便,因为你需要检查你的数据(文件名)来确定一个模式,以便可以一致地区分日期和其他文件名部分。

从你提供的内容看,可能需要进行几次拆分。首先按点号进行拆分,然后按空格字符进行拆分。从文件名列表中 .pop 出最后一个项目(日期),.join 列表其余部分。添加扩展名就可以了。这假定你没有 "abc xyz mm dd yyyy.ext" 格式的文件名日期部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接