Регулярное выражение Python для анализа объекта datetime.datetime из строки

У меня есть следующая строка:

"{'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.

Пожалуйста, добавьте необходимый языковой тег. Не все механизмы регулярных выражений одинаковы.

WJS 31.01.2023 16:54

Добавлен тег python и упомянут в заголовке!

avhhh 31.01.2023 16:56

Он выглядит хорошо.

Wiktor Stribiżew 31.01.2023 16:59

@WiktorStribiżew, извините, я случайно добавил отступы к фиктивным данным, которые работали для этого шаблона. Просто удалил новые строки, чтобы они более точно отражали данные, с которыми я работаю!

avhhh 31.01.2023 18:11

А как насчет datetime\.datetime\(((\d+)(,\s*\d+)*), tzinfo=(?:\(\)|[^()])*\)? Вы ожидаете что-нибудь в скобках?

Wiktor Stribiżew 31.01.2023 18:15

Вау, это сработало, спасибо! Тип текста после tzinfo= может быть любой буквой/специальным символом, который НЕ является пробелом или цифрой.

avhhh 31.01.2023 18:21

это выглядит близко к выводу при отображении словаря Python - возможно ли, чтобы дата и время выводились как временные метки эпохи вместо источника? docs.python.org/3/library/…

ti7 31.01.2023 20:04

@ ti7 Я действительно хочу преобразовать его обратно в объекты даты и времени, чтобы затем вызвать .isoformat() объект для сохранения в нашей системе. Можем ли мы сделать это без предварительного преобразования в datetime?

avhhh 31.01.2023 21:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
8
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

datetime\.datetime\((\d+(?:,\s*\d+)*), tzinfo=(?:\(\)|[^()])*\)

Подробности:

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

Посмотрите демонстрацию регулярного выражения .

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