如何在Python 3中使用正则表达式单独从文本文件中提取日期?
下面是我当前的代码:
import datetime
from datetime import date
import re
s = "birthday on 20/12/2018 and wedding aniversry on 04/01/1997 and dob is on
09/07/1897"
match = re.search(r'\d{2}/\d{2}/\d{4}', s)
date = datetime.datetime.strptime(match.group(), '%Y-%m-%d').date()
print (date)
预期输出为
20/12/2018
04/01/1997
09/07/1897
答案 0 :(得分:0)
您在'%Y-%m-%d'
附近有无效的日期格式,因为它本来应该'%d/%m/%Y
'查看您提供的日期:birthday on 20/12/2018
(dd/mm/yyyy)
更改此:
date = datetime.datetime.strptime(match.group(), '%Y-%m-%d').date()
使用此:
date = datetime.datetime.strptime(match.group(), '%d/%m/%Y').date()
您的修正:
import datetime
from datetime import date
import re
s = "birthday on 20/12/2018"
match = re.search(r'\d{2}/\d{2}/\d{4}', s)
date = datetime.datetime.strptime(match.group(), '%d/%m/%Y').date()
print (date)
但是:
为什么要陷入所有麻烦?当它们变得更轻松,更优雅时。
使用dparser
:
import dateutil.parser as dparser
dt_1 = "birthday on 20/12/2018"
print("Date: {}".format(dparser.parse(dt_1,fuzzy=True).date()))
输出:
Date: 2018-12-20
编辑:
现在,您编辑的问题具有多个日期,可以使用regex
提取它们:
import re
s = "birthday on 20/12/2018 and wedding aniversry on 04/01/1997 and dob is on 09/07/1897"
pattern = r'\d{2}/\d{2}/\d{4}'
print("\n".join(re.findall(pattern,s)))
输出:
20/12/2018
04/01/1997
09/07/1897
OR
使用dateutil
:
from dateutil.parser import parse
for s in s.split():
try:
print(parse(s))
except ValueError:
pass
输出:
2018-12-20 00:00:00
1997-04-01 00:00:00
1897-09-07 00:00:00
答案 1 :(得分:0)
您正在做的一切正确,期望这行,
date = datetime.datetime.strptime(match.group(), '%d/%m/%Y').date()
您必须提供与datetime.strptime
中的输入相同的格式。
'%Y-%m-%d' >> 2018-12-20
'%d/%m/%Y' >> 20/12/2018
修改
如果您不寻找日期时间对象。你可以这样
results = re.findall(r'\d{2}/\d{2}/\d{4}', s)
print('\n'.join(results))
输出
In [20]: results = re.findall(r'\d{2}/\d{2}/\d{4}', s)
In [21]: print('\n'.join(results))
20/12/2018
04/01/1997
09/07/1897