Как извлечь даты в формате дд / мм / гггг из неструктурированной строки? - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть несколько строк, как показано ниже:

'Thursday;60 days;Monday, days;the last two years;the six months;October 2017;March 2018;three days;Jan. 4;Last year;Dec. 21;'

ожидаемый результат: October 2017

'January 7;30;39;24;46;1750;April 2017;April 30;February;'

ожидаемый результат: April 2017

'Thursday;a day;another six days;the day;Tuesday;three days;mid-October;Wednesday;'

ожидаетсярезультат: mid-October

Я знаю, что строка полностью неструктурирована, но можем ли мы иметь код Python для получения дат даже из этих?

Это часть модели NER, где я нахожусьпытаясь извлечь объекты данных.

Я пробовал несколько методов, но они даже не были близки к результату, поскольку строка не имеет правильного шаблона

1 Ответ

1 голос
/ 26 сентября 2019

Вы можете использовать datefinder с регулярным выражением для проверки названий месяцев в найденных строках даты и времени:

import datefinder, re
from datetime import datetime

strs = ['Thursday;60 days;Monday, days;the last two years;the six months;October 2017;March 2018;three days;Jan. 4;Last year;Dec. 21;',
        'January 7;30;39;24;46;1750;April 2017;April 30;February;',
        'Thursday;a day;another six days;the day;Tuesday;three days;mid-October;Wednesday;']

day_of_week_rx = re.compile(r'(?:A(?:pr(?:il)?|ug(?:ust)?)|Dec(?:ember)?|Feb(?:ruary)?|J(?:an(?:uary)?|u(?:ly|ne|[ln]))|Ma(?:rch|[ry])|Nov(?:ember)?|Oct(?:ober)?|Sep(?:tember)?)', re.I)
for s in strs:
    raw_dates = list(datefinder.find_dates(s, source=True))
    print([y for x,y in raw_dates if day_of_week_rx.search(y)])

Вывод:

['October 2017', 'March 2018', 'Jan. 4', 'Dec. 21']
['January 7', 'April 2017', 'April 30']
[]

Обратите внимание, что mid-October не может быть приведен к действительному времени, поэтому он не извлекается.Вам нужно будет применить более конкретное регулярное выражение, например re.search(r'\b(?:half|mid)-(?:A(?:pr(?:il)?|ug(?:ust)?)|Dec(?:ember)?|Feb(?:ruary)?|J(?:an(?:uary)?|u(?:ly|ne|[ln]))|Ma(?:rch|[ry])|Nov(?:ember)?|Oct(?:ober)?|Sep(?:tember)?)', text).

. (?:A(?:pr(?:il)?|ug(?:ust)?)|Dec(?:ember)?|Feb(?:ruary)?|J(?:an(?:uary)?|u(?:ly|ne|[ln]))|Ma(?:rch|[ry])|Nov(?:ember)?|Oct(?:ober)?|Sep(?:tember)?) соответствует полному и сокращенному названию английского месяца.

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