Регулярное выражение для даты в Python

У меня есть большой набор данных с комментариями к фин. операциям.

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

Допустим есть коммент:

"Дата начисления 21.04.2022"

Отсюда мне надо вытащить только "21.04.2022" и преобразовать в единый формат 2022-04-21

Или, например:

"Дата начисления: 21/04/2022"

Задача та же, независимо от разделителей.

В AppsScript делал это регулярным выражением

/\d{2}(\D)\d{2}\1\d{4}/g

через String.match(), попробовал через re.match через то же выражение прокрутить строку, но это не работает почему-то.

Подскажите, что можно сделать. Возможно, есть более простой способ в питоне это реализовать

Так это было в AppsScript

acc_date = d.comment.toString().match(/\d{2}(\D)\d{2}\1\d{4}/g);

Так в Питоне

accDate = re.match("/\d{2}(\D)\d{2}\1\d{4}/g", str(transcation['comment']), flags=0)

Ответы (5 шт):

Автор решения: c0ol
  1. Разделяем split() на части;
  2. Метод datetime.strptime() анализирует входную строку с заданным форматом datetime и возвращает объект datetime.
import datetime

s = "Дата начисления 21.04.2022"

lst = s.split()

print(lst[2])

date_time_obj = datetime.datetime.strptime(lst[2], "%d.%m.%Y")

print('Дата:', date_time_obj.date())

ВЫВОД: 21.04.2022 Дата: 2022-04-21

→ Ссылка
Автор решения: tomato-magnet-regulato
import re 

data = '12/12/04'
search_sumbol = '[.,/]'
print(re.sub(search_sumbol, '-', data))
→ Ссылка
Автор решения: strawdog

Попробуйте начать с чего-то такого:

import re

a = "Дата начисления: 21/04/2022"
res = re.sub(r"[/\\.]", "-", re.search(r"(\d+.*?\d+.*?\d+)", a).group(1))

print(res)

21-04-2022

→ Ссылка
Автор решения: Dmitry

Пользовал одно время вот эту штуку.

Пример использования

import datefinder

a = datefinder.find_dates('"Дата начисления 21.04.2022". Отсюда мне надо вытащить только "21/04/2022"') 
b = list(a)
print(b)

# OUT
# [datetime.datetime(2022, 4, 21, 0, 0), datetime.datetime(2022, 4, 21, 0, 0)]

print(b[0].date().isoformat())

# OUT
# '2022-04-21'
→ Ссылка
Автор решения: Edward Grachev
import re
a = "Дата начисления 21.04.2022 Дата начисления 21/04/2021"
date = [ f'{i[2]}-{i[1]}-{i[0]}' for i in [x.replace(".", "/").split('/') for x in re.findall(r'\d{2}.\d{2}.\d{4}', a)]]
print(date)

Если разложить

import re
a = "Дата начисления 21.04.2022 Дата начисления 21/04/2021"
# Находим все даты в строке
date = re.findall(r'\d{2}.\d{2}.\d{4}', a)
date_list = []
for i in date:
    # Разделяем дату по . или /
    i = i.split('.') if '.' in i else i.split('/')
    date_list.append(f'{i[2]}-{i[1]}-{i[0]}')
print(date_list)
→ Ссылка