Извлечение дат из строки на естественном языке - PullRequest
0 голосов
/ 05 июля 2019

Я использую python для поиска дат в таких строках, как:

string01='los mantenimientos acontecieron en los dias 3,06,8 ,9, 15 y 29 de diciembre de 2018.Por cada mantenimiento fué cobrado $1,300.00 códigos de mantenimiento: (3)A34,(2)C54,(1)D65'

('сеансы руководства были в декабре 3,06,8, 9, 15 и 29 из 2018')

Сначала я пытаюсь с помощью регулярных выражений найти и разделить только даты и (не валюту), а затем преобразовать их в ожидаемый результат

ожидаемый результат: ['3/12/2018','06/12/2018','08/12/2018','09/12/2018','15/12/2018','29/12/2018']

string02='los mantenimientos sucedieron en: 2,04,05,8,9,10,11,14,15,22,24, y 27 de junio de 2018.Valor de cada uno de los mantenimiento: $1,300.00, códigos de mantenimiento: (1)A35,(6)C54,(5)D65'

(«Занятия были проведены в июне 2,04,05,8,9,10,11,14,15,22,24 и 27 из 2018 года») ожидаемый результат: ['02/06/2018','04/06/2018','05/06/2018','08/06/2018','09/06/2018','10/06/2018','11/06/2018','14/06/2018','15/06/2018','22/06/2018','24/06/2018','27/06/2018']

Iveпопробовал до сих пор:

dias=re.compile(r"((\s?[0-3]?[0-9]\s?\,?\s?){1,9}[0-3][0-9]|\sy\s[0-3][0-9]\sde\s(?:diciembre|junio)\sde\s[2][0][0-2][0-9])")

dias_found=re.findall(dias,string01)

но я получаю кортежи и дублированные значения:

[(' 3,06,8,9, 15', '9, '), (' y 29 de diciembre de 2018', '')]

['3','06','8','9','15','29 de diciembre de 2018']

Любая помощь будет принята с благодарностью.

Заранее спасибо.

1 Ответ

2 голосов
/ 06 июля 2019

Вы можете использовать модуль re вместе со строковыми манипуляциями для легкого извлечения дат

import requests
import re
import json

if __name__ == "__main__":
    texts = [
        'en los dias 3,06,8 ,9, 15 y 29 de diciembre de 2018.Por c',
        'n en: 2,04,05,8,9,10,11,14,15,22,24, y 27 de junio de 2018.Valor de',
    ]
    # select from the beginning of date-like text till the end of year
    pattern = r'\s*((\d+[\sy\,]*)+[\D\s]+20\d{2})'
    month_names = ['diciembre', 'junio']  # add others
    month_pattern = re.compile(f'({"|".join(month_names)})', flags=re.IGNORECASE)

    all_dates = []
    for item in texts:
        match = re.search(pattern, item)
        if not match:
            continue
        date_region: str = match.group(1)

        # find year
        year = re.search('(20\d{2})', date_region).group(1)

        # find month
        month_match = re.search(month_pattern, date_region)
        month = month_match.group(1)
        # remove everything after month
        date_region = date_region[: month_match.start()]
        # find all numbers, we're assuming they represent day of the month
        days = re.findall('(\d+)', date_region)

        found_dates = [f'{d}/{month}/{year}' for d in days]
        all_dates.append(found_dates)
    print(all_dates)


Я не знаю названий месяцев на португальском языке?(редактировать: это был испанский язык), но заменить их числами - тривиальная задача.вывод:

[['3/diciembre/2018',
  '06/diciembre/2018',
  '8/diciembre/2018',
  '9/diciembre/2018',
  '15/diciembre/2018',
  '29/diciembre/2018'],
 ['2/junio/2018',
  '04/junio/2018',
  '05/junio/2018',
  '8/junio/2018',
  '9/junio/2018',
  '10/junio/2018',
  '11/junio/2018',
  '14/junio/2018',
  '15/junio/2018',
  '22/junio/2018',
  '24/junio/2018',
  '27/junio/2018']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...