python - 有没有一种巧妙的方法可以从这个字符串列表中提取日期,其中一些字符串没有日期模式?
问题描述
我正在尝试制作一个快速脚本来简化一些无聊的会计工作。基本上我有一个文件夹,里面装满了名称类似于下面列表中的文件。
我需要按照前几个文件名中的指示重命名文件。
我对如何做到这一点有一个清晰的想法,并且正在编写一个快速脚本来完成它。但我遇到了一个愚蠢的问题。我想使用列表推导来获取日期列表,如最后一行所示。理想情况下,我想做的是:
[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'>]
解决方案
如果您使用 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']
推荐阅读
- python - 我应该使用什么结构格式字符串来存储 uint16_t、uint8_t、unint32_t、uint8_t 数组、uint8_t 枚举?
- kubernetes - webhook 的文件存在,但 cube-api 因文件不存在而失败
- python - 使用 Python 进行测试的自动构建文件
- slack - 为什么我会从 Slack Incoming Webhook 获得完整的降价响应?
- sql - Postgres 发现价值的变化
- javascript - 使用 mapStateToProps 和 connect() 调度后 React 组件未重新渲染
- go - 从 cmd 输出写入文件
- javascript - 警告:componentWillReceiveProps 已重命名,不推荐使用。请更新以下组件:控件
- javascript - 如何在用户操作之前停止执行 javascript 函数?
- node.js - ElectronJS 必须使用 import 来加载 ES Module