【问题标题】:Remove Dates from a file name before the extension从扩展名之前的文件名中删除日期
【发布时间】:2018-10-22 00:27:16
【问题描述】:

我的列表中有一些具有不同扩展名的文件名。

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

我用这个post 厌倦了以下,我把数字去掉了,但不是我想要的。

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 格式(或点和破折号的任意组合)吗?
  • 可能有很多极端案例......是否有任何公司名称以数字结尾,即brewers 120 5-2-2018.txt?日期是否总是出现在末尾,在扩展之前?
  • @Guillaume Ruchot,它是两者的结合。
  • @user 好问题,是的,名字后面也可以有数字。基本上,如果我能在扩展之前找到.- 格式的日期,那就太好了。

标签: python regex python-3.x list


【解决方案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']

如果你只是想删除日期

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

【讨论】:

  • 优雅的解决方案!
【解决方案2】:
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

【讨论】:

    【解决方案3】:

    替换也带走了你的点,所以文件不再有扩展名。我看到日期有多种格式,这没有帮助,因为您需要做的是检查您的数据(文件名)以确定一种模式,您可以使用该模式始终如一地区分日期,并且仅区分其余日期的日期文件名。

    根据您提供的信息,看起来可能需要进行几次拆分。我先按点分割,然后按空格字符分割。从文件名片段列表中,.pop 最后一项(日期)和 .join 列表的其余部分重新组合在一起。附加你的扩展,你会很好。这假设您没有“abc xyz mm dd yyyy.ext”格式的文件名日期

    【讨论】:

      【解决方案4】:

      正则表达式:

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

      Demo

      【讨论】:

      • 由于某种原因现在对我有用,是我遗漏了什么还是在python 2.7 中?相反,这有效,\s\d{1,2}[\.-]\d{1,2}[\.-]\d{4}
      • 不确定.. 使用 \1 是为了确保在日期和年份之间使用月份和日期之间使用的日期分隔符。试试改成\s\d{1,2}(?:\.|\-)\d{1,2}(?:\.|\-)\d{4}
      猜你喜欢
      • 2015-01-03
      • 2012-06-29
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 2013-03-14
      • 1970-01-01
      相关资源
      最近更新 更多