python - 如何使用正则表达式从文件名中提取日期
问题描述
我必须处理包含两个日期和某人全名的特定格式的长文件名。这是描述这种格式的模板:
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
.
任何帮助将不胜感激。
解决方案
您的解决方案不起作用的原因是因为_
在 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']
推荐阅读
- python-3.6 - 可以在具有 IBM PPC 架构的 RHEL7 上安装 python36 吗?
- angular - Angular 6 - 使用 Angular 材质的动态页面
- c++ - 关于二进制数字的 int 数组
- eclipse - eclipse中的mercurial插件 - 无法满足依赖错误
- ffmpeg - ffmpeg .264 视频转换为 jpg
- julia - 朱莉娅 | 数组元素作为另一个数组的参数
- android - Android 模拟器未激活
- swift - 如何在 linux 上快速线程睡眠
- c++ - 带有条件 constexpr 注释的 C++ 代码与 ODR 和链接器
- sql - 由于函数调用,SQL 索引变慢