как получить только строку даты из длинной строки - PullRequest
0 голосов
/ 04 декабря 2018

Я знаю, что есть много вопросов и ответов для извлечения даты и времени из строки, таких как dateutil.parser , для извлечения даты и времени из строки

import dateutil.parser as dparser
dparser.parse('something sep 28 2017 something',fuzzy=True).date()

output: datetime.date(2017, 9, 28)

, но мой вопрос, как узнатькакая часть строки приводит к этому извлечению, например, я хочу функцию, которая также возвращает мне 'sep 28 2017'

datetime, datetime_str = get_date_str('something sep 28 2017 something')
outputs: datetime.date(2017, 9, 28), 'sep 28 2017'

любой ключ или любое направление, которое я могу искать вокруг?

Ответы [ 2 ]

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

Продолжая обсуждение с @Paul и следуя решению от @alecxe, я предложил следующее решение, которое работает на ряде тестовых случаев, я поставил задачу немного сложнее:

Шаг 1: получить исключенные токены

import dateutil.parser as dparser

ostr = 'something sep 28 2017 something abcd'
_, excl_str = dparser.parse(ostr,fuzzy_with_tokens=True)

дает выходные данные:

excl_str:     ('something ', ' ', 'something abcd')

Шаг 2: ранжировать токены по длине

excl_str = list(excl_str)
excl_str.sort(reverse=True,key = len)

дает отсортированный список токенов:

excl_str:   ['something abcd', 'something ', ' ']

Шаг 3: удаление токенов и игнорирование пробела

for i in excl_str:
    if i != ' ':
        ostr = ostr.replace(i,'') 
return ostr

дает окончательный вывод

ostr:    'sep 28 2017 '

Примечание: шаг 2 необходим, потому что это вызовет проблему, если какой-либо более короткий токен подмножество более длинных.например, в этом случае, если удаление следует порядку ('something ', ' ', 'something abcd'), процесс замены удалит something из something abcd, а abcd никогда не удалится, в результате 'sep 28 2017 abcd'

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

Интересная проблема!Не существует прямого способа получить проанализированную строку даты из большей строки с dateutil.Проблема в том, что парсер dateutil даже не имеет этой строки в качестве промежуточного результата, поскольку он действительно строит части будущего объекта datetime на лету и посимвольно ( source ).

Он также собирает список пропущенных токенов, что, вероятно, является вашей лучшей ставкой.Поскольку этот список упорядочен, вы можете перебрать токены и заменить первое вхождение токена:

from dateutil import parser


s = 'something sep 28 2017 something'
parsed_datetime, tokens = parser.parse(s, fuzzy_with_tokens=True)

for token in tokens:
    s = s.replace(token.lstrip(), "", 1)

print(s)  # prints "sep 28 2017"

Хотя я не уверен на 100%, будет ли это работать во всех возможных случаях, особенно сразличные пробельные символы (обратите внимание, как мне приходилось обходить вещи с помощью .lstrip()).

...