首页 > 解决方案 > 如何使用正则表达式替换 Python 中 dict 的内容

问题描述

我必须修改一个非常大的 JSON 文件(36MB),基本上我需要的是删除整个文件的时间戳。

由于应用程序崩溃,我无法使用 sublime text 或其他 IDE,我别无选择,只能使用 python 手动处理文件。

我想到的过程如下:

  1. 打开 JSON 文件
  2. 将 JSON 文件转换为 dict
  3. 删除字典中的时间戳
  4. 将 json 格式的 dict 导出到新文件中。

这是我的问题:

我需要编辑整个字典并将 TXX:XX:XX 替换为 ' ' (空字符)。JSON 文件必须采用 YYYY-MM-DD 格式。

所以假设我有这个日期:2021-11-02T00:04:03替换时间戳后应该是这样的:2021-11-02

再举一个例子:

2021-10-02T01:04:03应该2021-10-02

等等。

我知道这个正则表达式T00.{6}适用于案例 00,但其他情况呢?01, 02, 03, 04 ... 等等。是否有适用于所有情况的通用正则表达式?

最重要的是,我如何在字典中查找所有值并将时间戳替换为"".

标签: pythonjsondictionary

解决方案


据我了解,问题是:

  1. 确定给定字符串是否为 形式####-##-##T##:##:##,其中 # 是任意数字;
  2. 如果是这样,则截断字符串以仅包含 T 之前的部分;如果没有,请保持原样。

如果这是正确的,我们可以这样做:

def truncate_timestamp(potential_date_str):
  pattern = '^([0-9]{4}-[0-9]{2}-[0-9]{2})T[0-9]{2}:[0-9]{2}:[0-9]{2}$'
  match = re.search(pattern, potential_date_str)
  if match:
    return match.group(1)
  else:
    return potential_date_str

这会产生以下结果:

>>> truncate_timestamp('2021-11-02T00:04:03')
'2021-11-02'
>>> truncate_timestamp('Canned Frozen Orange Juice')
'Canned Frozen Orange Juice'

re.search如果匹配成功,则返回真值,否则返回假值。这里给出的模式pattern只是透明地编码了字符串由四个数字组成的事实,后跟一个破折号等,并且有一个用于日期部分的捕获组。如果我们成功匹配,我们将返回我们捕获的内容,这将是日期。如果不是,这不是时间戳,所以我们不理会它。


推荐阅读