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

Цель: извлечь даты из медицинских карт (хранится в серии "Панды", даты представлены во всех возможных форматах)

Для числовых дат я использовал:

str.extractall(r'((?:\b\d{1,2}[/]){1,2}(?:(?:\d{2}\b)|\b\d{4}\b))')

Проблема:

Введите текст1:

"(5/11/85) Crt-1.96, BUN-26; AST/ALT-16/22; Independent

Выход 1: 5/11/85 (по желанию), но также: 16/22

Введите текст 2:

[text...] (7/11/77) CBC: 4.9/36/308 Pertinent [...]:

Выход2: 7/11/77 (как хотелось бы) но также 9/36

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

[^-] делает это еще хуже.

Даты везде в тексте, например:

[...] has also taken diet pills (last episode in Feb 1993) but [...]

Февраль 1993 года и т. Д. Не было проблемой.

2 ответа

Вы должны указать, что означает "все форматы". В вашем примере вы просто показываете 1 формат. Может ли присутствовать "JAN-02-2016" "02.02.2016" "01.02.2016"? Европейские и американские форматы времени? так далее?

В вашем примере это выглядит так, будто даты всегда находятся в начале строки и заключены в скобки, что делает их довольно простыми.

^ ((\ D +/\ D +)).| ^ ((\ d +/\ d + / d +)).

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

Тогда я бы предложил вам разобрать такие грубые даты в реальные, полноценные объекты дат. Он служит двум основным целям: во-первых, вы отфильтровываете отрицательные совпадения с регулярными выражениями; во-вторых, теперь вы можете справляться со своими датами гораздо более удобным и удобным способом, используя методы объекта date вместо сравнения только текстовых строк. Например, вы можете получить доступ к дате, месяцу или году, сравнить их с желаемым значением и отфильтровать даты на основе такого сравнения.

Для разбора дат я бы рекомендовал вам использовать одну из сложных библиотек разбора дат, такую ​​как dateutil или же dateparser, который обрабатывает много сложных деталей для вас, бесплатно.

Другие вопросы по тегам