Извлечение дат из неравномерно структурированных строк - PullRequest
0 голосов
/ 19 декабря 2018

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

  1. 5 месяцев и 17 часов
  2. 1 месяц и 19 дней
  3. 3 месяца и 1 день
  4. 2 года1 месяц и 2 дня
  5. 1 год 1 месяц и 1 день и 1 час

И я хотел бы извлечь:

  1. y = 0m = 5 d = 0 h = 17
  2. y = 0 m = 1 d = 19 h = 0
  3. y = 0 m = 3 d = 1 h = 0
  4. у = 2 м = 1 д = 2 ч = 0
  5. у = 1 м = 1 д = 1 ч = 1

Я начал работать над чем-то вроде этого:

publishedWhen = '1 year 1 month and 1 days and 1 hour'

y,m,d,h = 0,0,0,0

if 'day ' in publishedWhen:
    d = int(publishedWhen.split(' day ')[0])

if 'days ' in publishedWhen:
    d = int(publishedWhen.split(' days ')[0])

if 'days ' not in publishedWhen and 'day ' not in publishedWhen:
    d = 0

if 'month ' in publishedWhen:
    m = int(publishedWhen.split(' month ')[0])
    d = int(publishedWhen.replace(publishedWhen.split(' month ')[0] + ' month ','').replace('and','').replace('days','').replace('day',''))

if 'months ' in publishedWhen:
    m = int(publishedWhen.split(' months ')[0])

Однако я знаю, что этот код содержит ошибки (некоторые случаи, вероятно, не принимаются во внимание), и что регулярное выражение, вероятно, произведет что-то более чистое и эффективное.Это правда?Какое регулярное выражение поможет мне извлечь всю эту информацию?

1 Ответ

0 голосов
/ 19 декабря 2018

Вам не нужно использовать регулярные выражения {2} ion? и вместо этого посмотрите очень богатую библиотеку сторонних пакетов в Индексе пакетов Python.

Например, вы можете использовать комбинацию dateparser - для разбора удобочитаемых дат и dateutil - для относительного дельта-объекта :

from datetime import datetime

import dateparser as dateparser
from dateutil.relativedelta import relativedelta


BASE_DATE = datetime(2018, 1, 1)


def get_relative_date(date_string):
    parsed_date = dateparser.parse(date_string, settings={"RELATIVE_BASE": BASE_DATE})
    return relativedelta(parsed_date, BASE_DATE)


date_strings = [
    "5 months and 17 hours",
    "1 month and 19 days",
    "3 months and 1 day",
    "2 years 1 month and 2 days",
    "1 year 1 month and 1 days and 1 hour"
]

for date_string in date_strings:
    delta = get_relative_date(date_string)
    print(f"y={abs(delta.years)} m={abs(delta.months)} d={abs(delta.days)} h={abs(delta.hours)}")

Отпечатки:

y=0 m=5 d=0 h=17
y=0 m=1 d=19 h=0
y=0 m=3 d=1 h=0
y=2 m=1 d=2 h=0
y=1 m=1 d=1 h=1

Мне не особо нравится необходимость делать дельту с некоторой базовой датой, и я почти уверен, что есть пакет, который может анализироваться непосредственно в объекте дельты.Открыты для любых предложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...