Datetime и RegEx Dates - PullRequest
       5

Datetime и RegEx Dates

0 голосов
/ 23 сентября 2018

Я очищаю строки от элементов HTML, которые содержат даты.Я собираюсь извлечь даты с помощью регулярного выражения, а затем преобразовать их в другой формат, используя модуль datetime.Строки имеют следующий формат:

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

Хитрость заключается в том, что сокращаются только месяцы с длинными именами.

Jan.
Feb.
March
April
May
June
July
Aug.
Sept.
Oct.
Nov.
Dec.

Моей первой идеей было выбрать все, кроме Date first available at Amazon.ca:, но, очевидно, это немного сложнее, чем я мог себе представить.

Моя следующая идея была похожа на r'^(J|F|M|A|S|O|De)', но, очевидно, это не сработает, поскольку месяцы не расположены вначало строки.

Теперь я застрял на идеях.

Очевидно, что будет работать что-то вроде следующего регулярного выражения, но оно кажется слишком многословным.

r'(Jan.|Feb.|March|April|May|June|July|Aug.|Sept.|Oct.|Nov.|Dec.)[\d\s]+'

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

Вы можете попробовать это:

import re
dlist = [
"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"]
print([re.search(r"(?<=\: )[a-zA-Z]+\.*[0-9 ]+" , each).group(0) for each in dlist])
0 голосов
/ 23 сентября 2018

Итак, вот мое решение полностью.

first_available = ff.find_elements(By.XPATH, '//li[contains(., "Date first available")]')
regex_first_available = re.compile(r'(Jan|Feb|March|April|May|June|July|Aug|Sept|Oct|Nov|Dec)[\d\s]+')

if len(first_available) > 0:
    first_available = regex_first_available.search(first_available[0].text).group(0)
else:
    first_available = ff.find_element(By.XPATH, '//td[text()="Date First Available"]/following-sibling::td[1]').text.replace('.', '')

try:
    first_available = datetime.datetime.strptime(first_available, '%b %d %Y').strftime('%Y-%m-%d')
except ValueError:
    first_available = datetime.datetime.strptime(first_available, '%B %d %Y').strftime('%Y-%m-%d')

Если кто-то улучшит этот подход, я вместо этого выберу ваше решение в качестве ответа.

0 голосов
/ 23 сентября 2018

Вы можете найти месяц, день и год, выполнив поиск букв с возможными ".":

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...