Извлечение дат с помощью регулярных выражений в нескольких форматах

#python #regex #date

#python #регулярное выражение #Дата

Вопрос:

 (?:d{1,2}[-/])?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|January|February|March|April|May|June|July|August|September|October|November|December)?[,.s]*(?:d{1,2}[-/.)s,]*) (?:d{2,4})(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|January|February|March|April|May|June|July|August|September|October|November|December)?[,.s]*(?:d{1,2}[-/.),]*)
  

Я пытался извлечь даты из текста из этих ff. format:

  • 1 января 2020 г.
  • 01 января 2020 г.
  • 1 ЯНВАРЯ 2020 г.
  • 01 ЯНВАРЯ 2020 г.
  • 1 января 2020 г.
  • 01 января 2020 г.
  • 1 ЯНВАРЯ 2020 г.
  • 01 ЯНВАРЯ 2020 г.
  • 1 января 2020 года
  • 01 января 2020 года
  • 1 Января 2020 года
  • 01 Января 2020 г.
  • 1 ЯНВАРЯ 2020 ГОДА
  • 01 ЯНВАРЯ 2020 г.
  • 01/01/2020
  • 2020/01/01
  • 01.01.2020
  • 2020.01.01
  • 01-01-2020
  • 2020-01-01

Вот пример. Проблема заключается в том, когда он пытается извлечь из этого формата 2020 JAN. 1 , 2020 JAN. 01 , 2020 Jan. 01 , 2020-01-01 .

Комментарии:

1. Я бы сделал это не с одним регулярным выражением, а с одним регулярным выражением на образец / формат.

2. Тексты взяты из документа, они извлекаются с помощью tesseract. Форматы дат могут быть любыми из следующих, упомянутых выше. Как бы я сделал это по-вашему? Спасибо

Ответ №1:

Вы можете использовать

 pattern = r"""(?ix)
  b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(?:Nov|Dec)(?:ember)?) [s.]* (?:0?[1-9]|[12][0-9]|3[01]) [s,.]* (?:19|20)(?:d{2})? # Jan 01 2000
|
  (?<!d)(?:19|20)(?:d{2})? [s,.]* (?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(?:Nov|Dec)(?:ember)?) [s.]* (?:0?[1-9]|[12][0-9]|3[01]) # 2000 Jan 01
|
 (?<!d)
   (?:
    (?:0?[1-9]|1[012])[-/.]?(?:0?[1-9]|[12][0-9]|3[01])[-/.]?(?:19|20)dd # MM/dd/yyyy
     |
    (?:19|20)dd[-/.]?(?:0?[1-9]|1[012])[-/.]?(?:0?[1-9]|[12][0-9]|3[01]) # yyyy/MM/dd
   )
 (?!d)"""
  

Смотрите демонстрацию регулярных выражений

Флаг i модификатора включает сопоставление без учета регистра и x включает ПОДРОБНЫЙ режим.

Комментарии:

1. Он соответствует FEB-200 и 02 February 2

2. @MattMateo Теперь лучше? Пожалуйста, настройте шаблон по своему усмотрению, мы не видим все ваши данные.