我有一组文件名,我需要从中提取它们的日期。文件名如下所示:
['1 120836_1_20210101.csv',
'1 120836_1_20210108.csv',
'1 120836_20210101.csv',
'1 120836_20210108.csv',
'10 120836_1_20210312.csv',
'10 120836_20210312.csv',
'11 120836_1_20210319.csv',
'11 120836_20210319.csv',
'12 120836_1_20210326.csv',
...
]
作为一个例子,我需要从上面列表的第一项中提取20210101
。
这是我的代码,但它不工作-我不完全熟悉正则表达式。
import re
dates = []
for file in files:
dates.extend(re.findall("(?<=_)d{}(?=d*.)", file))
你说得还不错,但还是有一些问题:
- 您通过
.findall
的结果扩展dates
,但您只期望找到一个并且正在构建所有dates
,因此在列表推导 中使用 - 你的正则表达式有一些不必要的复杂性(和一些bug)
re.search
会简单得多这是你想要的:
import re
files = [
'1 120836_1_20210101.csv',
'1 120836_1_20210108.csv',
'1 120836_20210101.csv',
'1 120836_20210108.csv',
'10 120836_1_20210312.csv',
'10 120836_20210312.csv',
'11 120836_1_20210319.csv',
'11 120836_20210319.csv',
'12 120836_1_20210326.csv'
]
dates = [re.search(r"(?<=_)d+(?=.)", fn).group(0) for fn in files]
print(dates)
输出:
['20210101', '20210108', '20210101', '20210108', '20210312', '20210312', '20210319', '20210319', '20210326']
继续查找下划线,并将前面的查找更改为查找句号。它只匹配两个数字之间的所有数字(至少一个,带+
)。
注意r
字符串前避免不得不双正则表达式中的反斜杠,d
反斜杠和.
仍然需要显示数字和文字的时期。