首页 > 解决方案 > 如何使用正则表达式从文件名中提取日期

问题描述

我必须处理包含两个日期和某人全名的特定格式的长文件名。这是描述这种格式的模板:

firstname_middlename_lastname_yyyy-mm-dd_text1_text2_yyyy-mm-dd.xls

如何使用正则表达式从该文件名中提取全名、第一个日期和第二个日期?

我试图提取第一个日期,例如:

string1 = 'CHEN_MOU_MOU_1999-04-11_Scientific_Report_2020-03-14.xlsx'
ptn = re.compile('\b(\d{4}-\d{2}-\d{2})\b')
print(ptn.match(string1))

但这似乎不起作用。我得到的输出是None.

任何帮助将不胜感激。

标签: pythonregex

解决方案


您的解决方案不起作用的原因是因为_在 Python 中被视为字母数字字符。

来自文档

\w
匹配任何字母数字字符;这相当于类[a-zA-Z0-9_]

所以在你的字符串\b中不匹配。_但它会匹配-

来自文档

\b 这是一个零宽度断言,仅匹配单词的开头或结尾。单词被定义为一系列字母数字字符,因此单词的结尾由空格或非字母数字字符表示。

但是如果你用(连字符)替换_你的日期-,那么你的解决方案就可以了。

>>> import re
>>> string1 = 'CHEN_MOU_MOU-1999-04-11-Scientific Report-2020-03-14.xlsx'
>>> ptn = re.compile(r'\b(\d{4}-\d{2}-\d{2})\b')
>>> ptn.findall(string1)
['1999-04-11', '2020-03-14']

以下是适用于您的任务的解决方案:

$ python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> string1 = 'CHEN_MOU_MOU_1999-04-11_Scientific_Report_2020-03-14.xlsx'
>>> fullnamepattern = r'[a-zA-Z]+_[a-zA-Z]+_[a-zA-Z]+'
>>> datepattern = r'\d{4}-\d{2}-\d{2}'
>>> re.search(fullnamepattern, string1).group()
'CHEN_MOU_MOU'
>>> re.findall(datepattern, string1)
['1999-04-11', '2020-03-14']

推荐阅读