以下代码仅打印2018年11月2日;如何修改代码,以便同时选择两种日期格式。
import re
string = "some text contains 2-Nov-2018 and 3-11-2018"
date = re.findall('\d{1,2}[/-]\D{1,8}[/-]\d{2,4}', string)
print(date)
答案 0 :(得分:0)
我认为最简单的方法是编写多个模式。
(假设您只是在寻找这两种模式-如果您要寻找每种可能的日期格式,显然做起来会更加复杂)
import re
date_string = "some text contains 2-Nov-2018 and 3-11-2018"
formats = [r'\d{1,2}[/-]\D{1,8}[/-]\d{2,4}', # List of patterns
r'\d{1,2}[/-]\d{1,2}[/-]\d{2,4}']
dates = re.findall('|'.join(formats), date_string) # Join with | operator
dates
# ['2-Nov-2018', '3-11-2018']
要对此之后的日期进行标准化,您可以尝试使用pandas.to_datetime
之类的方法:
import pandas as pd
dates = ['2-Nov-2018', '3-11-2018']
std_dates = [pd.to_datetime(d) for d in dates]
std_dates
# [Timestamp('2018-11-02 00:00:00'), Timestamp('2018-03-11 00:00:00')]
正如一些评论中提到的那样,可能已经建立了一些库来为您完成所有这些工作。因此,如果您正在寻找一种更通用的方法,我将看看这些库。
答案 1 :(得分:0)
要获取各种日期格式,请导入datetime库。
import datetime as dt
fmts = ('%Y','%b %d, %Y','%b %d, %Y','%B %d, %Y','%B %d %Y','%m/%d/%Y','%m/%d/%y','%b %Y','%B%Y','%b %d,%Y')
parsed=[]
for e in txt.splitlines():
for fmt in fmts:
try:
t = dt.datetime.strptime(e, fmt)
parsed.append((e, fmt, t))
break
except ValueError as err:
pass
# check that all the cases are handled
success={t[0] for t in parsed}
for e in txt.splitlines():
if e not in success:
print e
for t in parsed:
print '"{:20}" => "{:20}" => {}'.format(*t)
来源::link