我有以下字符串:
"{'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.
1条答案
按热度按时间hgc7kmma1#
您可以使用
datetime\.datetime\(
-一个datetime.datetime(
字符串(\d+(?:,\s*\d+)*)
-第1组:一个或多个数字,然后零次或多次重复逗号+零个或多个空格,然后一个或多个数字, tzinfo=
-文字字符串(?:\(\)|[^()])*
-()
字符串或除(
和)
之外的任何字符的零次或多次重复\)
-一个)
字符请参见regex demo。