查找字符串中以各种格式表示的日期

时间:2018-12-04 05:37:03

标签: python python-3.x datetime

以下代码仅打印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)

2 个答案:

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