日期和数字的Python正则表达式,查找日期格式

时间:2019-03-25 09:19:17

标签: python regex python-3.x

如何在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

2 个答案:

答案 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