У меня есть следующая строка:
"{'foo': datetime.datetime(2022, 5, 23, 0, 0, tzinfo=tzlocal()), 'bar': 'some data', 'foobar': datetime.datetime(2022, 8, 3, 13, 57, 41, tzinfo=<UTC>), 'barlist': ['hello', 'world']}"
Я хочу иметь возможность сопоставлять все строки datetime.datetime(...) в этой строке и заменять их числами только в форме списка. Итак, ожидаемый результат:
"{'foo': [2022, 5, 23, 0, 0], 'bar': 'some data', 'foobar': [2022, 8, 3, 13, 57, 41], 'barlist': ['hello', 'world']}"
У меня есть что-то вроде этого:
DATETIME_PATTERN = r"datetime.datetime\(((\d+)(,\s*\d+)*), tzinfo=.*\)"
modified_input_str = re.sub(DATETIME_PATTERN, r"[\1]", input_str)
но он заменяет большой кусок данных между совпадениями. Как я могу изменить регулярное выражение, чтобы выполнить то, что я хочу?
Заключение: Я изменил текущий лучший ответ, чтобы он больше соответствовал моему конкретному варианту использования:
DATETIME_PATTERN = r"datetime\.datetime\((\d+(?:,\s*\d+)*), tzinfo=(?:[^\s\d])*\)"
# The difference is that the string at the end of 'tzinfo=' can be anything but whitespace or numbers.
Добавлен тег python и упомянут в заголовке!
Он выглядит хорошо.
@WiktorStribiżew, извините, я случайно добавил отступы к фиктивным данным, которые работали для этого шаблона. Просто удалил новые строки, чтобы они более точно отражали данные, с которыми я работаю!
А как насчет datetime\.datetime\(((\d+)(,\s*\d+)*), tzinfo=(?:\(\)|[^()])*\)? Вы ожидаете что-нибудь в скобках?
Вау, это сработало, спасибо! Тип текста после tzinfo= может быть любой буквой/специальным символом, который НЕ является пробелом или цифрой.
это выглядит близко к выводу при отображении словаря Python - возможно ли, чтобы дата и время выводились как временные метки эпохи вместо источника? docs.python.org/3/library/…
@ ti7 Я действительно хочу преобразовать его обратно в объекты даты и времени, чтобы затем вызвать .isoformat() объект для сохранения в нашей системе. Можем ли мы сделать это без предварительного преобразования в datetime?






Вы можете использовать
datetime\.datetime\((\d+(?:,\s*\d+)*), tzinfo=(?:\(\)|[^()])*\)
Подробности:
datetime\.datetime\( - строка datetime.datetime((\d+(?:,\s*\d+)*) - Группа 1: одна или несколько цифр, а затем ноль или более повторений запятой + ноль или более пробелов, а затем одна или несколько цифр, tzinfo= - литеральная строка(?:\(\)|[^()])* - ноль или более повторений строки () или любого символа, кроме ( и )\) - символ ).Посмотрите демонстрацию регулярного выражения .
Пожалуйста, добавьте необходимый языковой тег. Не все механизмы регулярных выражений одинаковы.