Вы можете найти месяц, день и год, выполнив поиск букв с возможными "."
:
import re, datetime
months = {b:a for a, b in enumerate(['Jan.', 'Feb.', 'March', 'April', 'May', 'June', 'July', 'Aug.', 'Sept.', 'Oct.', 'Nov.', 'Dec.'], 1)}
def convert_date(d:str) -> str:
month, day, year = d.split()
return datetime.datetime(int(year), months[month], int(day))
data = ['Date first available at Amazon.ca: Nov. 23 2017', 'Date first available at Amazon.ca: March 27 2017', 'Date first available at Amazon.ca: March 6 2018']
new_data = [re.findall('[a-zA-Z]+\.*\s\d+\s\d+$', i) for i in data]
final_results = [convert_date(i[0]) for i in new_data if i]
Вывод:
[datetime.datetime(2017, 11, 23, 0, 0), datetime.datetime(2017, 3, 27, 0, 0), datetime.datetime(2018, 3, 6, 0, 0)]
Время:
import time
def timeit(f):
_t1 = time.time()
_ = f()
print(f'{f.__name__}: completed in {time.time()-_t1}')
@timeit
def ajax1234():
new_data = [re.findall('[a-zA-Z]+\.*\s\d+\s\d+$', i) for i in data]
@timeit
def anthony():
t = [re.findall('(Jan.|Feb.|March|April|May|June|July|Aug.|Sept.|Oct.|Nov.|Dec.)[\d\s]+', i) for i in data]
Выход:
ajax1234: completed in 4.982948303222656e-05
anthony: completed in 3.314018249511719e-05