首页 > 解决方案 > 有没有一种巧妙的方法可以从这个字符串列表中提取日期,其中一些字符串没有日期模式?

问题描述

我正在尝试制作一个快速脚本来简化一些无聊的会计工作。基本上我有一个文件夹,里面装满了名称类似于下面列表中的文件。

我需要按照前几个文件名中的指示重命名文件。

我对如何做到这一点有一个清晰的想法,并且正在编写一个快速脚本来完成它。但我遇到了一个愚蠢的问题。我想使用列表推导来获取日期列表,如最后一行所示。理想情况下,我想做的是:

[re.search(date_pattern, file).match for file in list_of_reciepts]

但这在缺少日期字段的文件名上失败。

关于一个不错的整洁替代方案的任何想法?

import re

list_of_reciepts = [
   '2021-10-18 1.pdf',
   '2021-10-18 2.pdf',
   '2021-10-18 3.pdf',
   'Financial History - Linkt.pdf',
   'Scan from 2021-10-04 05_14_16 PM.pdf',
   'Scan from 2021-10-07 11_41_26 AM.pdf',
   'Scan from 2021-10-19 05_13_22 PM.pdf',
]

date_pattern = re.compile(r'\d{4}-\d{2}-\d{2}')

[re.search(date_pattern, file) for file in list_of_reciepts]
>>>[<re.Match object; span=(0, 10), match='2021-10-18'>,
    <re.Match object; span=(0, 10), match='2021-10-18'>,
    <re.Match object; span=(0, 10), match='2021-10-18'>,
    None,
    <re.Match object; span=(10, 20), match='2021-10-04'>,
    <re.Match object; span=(10, 20), match='2021-10-07'>,
    <re.Match object; span=(10, 20), match='2021-10-19'>]

标签: pythonregexlist

解决方案


如果您使用 Python >= 3.8,则可以使用 walrus 运算符:

>>> [sre.group() for file in list_of_reciepts
         if (sre := re.search(date_pattern, file))]

['2021-10-18',
 '2021-10-18',
 '2021-10-18',
 '2021-10-04',
 '2021-10-07',
 '2021-10-19']

对于 Python < 3.8,使用双重理解:

>>> [sre.group() for sre in [re.search(date_pattern, file)
         for file in list_of_reciepts] if sre]
['2021-10-18',
 '2021-10-18',
 '2021-10-18',
 '2021-10-04',
 '2021-10-07',
 '2021-10-19']

如果你想保留None

>>> [sre.group() if (sre := re.search(date_pattern, file)) else None
         for file in list_of_reciepts]
['2021-10-18',
 '2021-10-18',
 '2021-10-18',
 None,
 '2021-10-04',
 '2021-10-07',
 '2021-10-19']

推荐阅读