Извлечение года, предшествующего месяцу с использованием регулярных выражений python - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть тысячи наборов данных, из которых я заинтересован в извлечении года, предшествующего месяцу. Например:

В наборе данных 1: сентябрь 1980

В наборе данных 2: октябрь 1978

Регулярное выражение, которое я написал с использованием https://regex101.com/ :

^(?<month>)\w+(\1)\s[0-9]{4}$|(^(?<fmonth>)\w+,\s[0-9]{4}$)

Это делает работу, используя ссылку. Однако, когда я пытался использовать его в своем коде python, я получал следующую ошибку:

  File "<ipython-input-216-a995358d0957>", line 1, in <module>
    runfile('C:/Users/Muntabir/nltk_data/corpora/cookbook/clean_data/text-classification_year(clean).py', wdir='C:/Users/Muntabir/nltk_data/corpora/cookbook/clean_data')
  File "C:\Users\Muntabir\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)
  File "C:\Users\Muntabir\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)
  File "C:/Users/Muntabir/nltk_data/corpora/cookbook/clean_data/text-classification_year(clean).py", line 76, in <module>
    year_data = re.findall('^(?<month>)\w+(\1)\s[0-9]{4}$|(^(?<fmonth>)\w+,\s[0-9]{4}$)', tokenized_string)
  File "C:\Users\Muntabir\Anaconda3\lib\re.py", line 222, in findall
    return _compile(pattern, flags).findall(string)
  File "C:\Users\Muntabir\Anaconda3\lib\re.py", line 301, in _compile
    p = sre_compile.compile(pattern, flags)
  File "C:\Users\Muntabir\Anaconda3\lib\sre_compile.py", line 562, in compile
    p = sre_parse.parse(p, flags)
  File "C:\Users\Muntabir\Anaconda3\lib\sre_parse.py", line 855, in parse
    p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0)
  File "C:\Users\Muntabir\Anaconda3\lib\sre_parse.py", line 416, in _parse_sub
    not nested and not items))
  File "C:\Users\Muntabir\Anaconda3\lib\sre_parse.py", line 691, in _parse
    len(char) + 2)
error: unknown extension ?<m

Я не уверен, почему она вызывает эту ошибку. Кто-нибудь может дать мне объяснение с возможным решением? Ваша помощь будет высоко ценится.

Спасибо

Ответы [ 3 ]

1 голос
/ 03 марта 2020

Я действительно ценю все ваши вклады. Но решение @Joan Lara Ganau предоставило мне руководство, каким может быть регулярное выражение. @Joan, ваше регулярное выражение будет соответствовать, если любой год предшествует месяц и дата. Кроме того, он не ищет запятую и пробел. Как я уже говорил, у меня есть тысячи наборов данных, из которых я точно хочу извлечь год, предшествующий месяцу. Я искал следующий формат:

a.) Месяц Год b.) Месяц, Год

В любом случае, после ряда экспериментов я нашел решение своей проблемы. Решение:

year_result = re.compile(
                    r"(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|"
                    "Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|"
                    "Dec(ember)?)(,?)(\s\d{4})")

Кроме того, метод match () также вернет Нет , если шаблон не будет сопоставлен. В этом случае использование метода group () вызовет AttributeError. Ошибка что-то вроде None объект типа не имеет соответствующей group (). Итак, я исправил это следующим образом:

def matched(document):                   
         year = year_result.match(document)
         year = year_result.search(document)
         if year is None:
               return '0'
         return year.group(14)

Теперь вы можете передать текстовый документ, из которого вы хотите извлечь год, в вышеуказанную функцию.

Спасибо

0 голосов
/ 25 февраля 2020

Именованная группа захвата: (?P<name>...) не (?<name>...).

Использование: ^(?P<month>\w+),?\s[0-9]{4}$

Демонстрация и объяснение

0 голосов
/ 25 февраля 2020
import re

year = re.compile(r'(\b\d{1,2}\D{0,3})?\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(Nov|Dec)(?:ember)?)\D?\D?(\d{1,4})')
print(year.match('September 1980').group(3))
print(year.match('October, 1978').group(3))

Выход:

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