在python中将字符串列表中的元素和下一个元素转换为日期

时间:2017-05-13 19:11:51

标签: python regex string date

我是Python新手,遇到以下字符串时出现问题:

  

立即订购,于4月25日星期二免费送货或订购   珠宝于4月29日星期二举行。

我已将其转换为.split()的字符串列表。但是,我无法弄清楚如何遍历列表以提取日期,如4月25日和4月29日。一旦我将这些字符串拉出来,我知道我可以将它们转换为datetime.strptime(string, '%B %d')的日期格式{ {1}}正在" 4月25日"和#34; 4月29日"并且可以应用日期差异功能。

我认为我需要将包含月份名称的列表元素作为字符串,并将下一个元素与月份中的日期相结合,以便将它们转换为日期格式。

非常感谢任何帮助。先感谢您。

2 个答案:

答案 0 :(得分:2)

赞美正则表达式的力量:

import re
from datetime import datetime

s = "Order now for free delivery loose on Tuesday, April 25 or set in jewelry on Tuesday, April 29."

# regex looking for dates in the given format
rx = re.compile(r'''
            (?:(?:Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day),\s+
            (?:January|February|March|April|May|June|July|August|September|October|November|December)\s+
            \d+
            ''', re.VERBOSE)

dates = [datetime.strptime("{} #{}".format(m.group(0), "2017"), '%A, %B %d #%Y') 
        for m in rx.finditer(s)]
print(dates)
# [datetime.datetime(2017, 4, 25, 0, 0), datetime.datetime(2017, 4, 29, 0, 0)]

答案 1 :(得分:1)

如果它适用于当前的 2017 年,则解决方案使用
calendar.day_name(一周中的几天),
calendar.month_name(一年中的几个月)和datetime.strptime()功能:

import calendar, datetime

s = 'Order now for free delivery loose on Tuesday, April 25 or set in jewelry on Tuesday, April 29'
day_names = '|'.join(list(calendar.day_name))  # Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday
month_names = '|'.join(list(calendar.month_name[1:]))
dates = re.findall(r'((' + day_names + '), (' + month_names + ') \d{1,2})', s)
datetimes = [datetime.datetime.strptime(d[0] + ' 2017', '%A, %B %d %Y') for d in dates]

print(datetimes)

输出:

[datetime.datetime(2017, 4, 25, 0, 0), datetime.datetime(2017, 4, 29, 0, 0)]