【问题标题】:How to replace the content of a dict in Python using regex如何使用正则表达式替换 Python 中 dict 的内容
【发布时间】:2021-07-16 01:20:01
【问题描述】:

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

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

我想到的过程如下:

  1. 打开 JSON 文件
  2. 将 JSON 文件转换为字典
  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 ...等。是否有适用于所有情况的通用正则表达式?

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

【问题讨论】:

  • “我不能使用 sublime text ... 因为应用程序崩溃了”值得更多关注。根据我的经验,这似乎不太可能。也许你有一个错误的插件,所以尝试禁用所有插件。
  • 不,我在不同的电脑和不同的应用程序(如 Visual Studio Code)上试过,只是文件太大,无法执行Find - Replace All
  • 你知道哪些字段包含时间戳吗?

标签: python json dictionary


【解决方案1】:

据我了解,问题是:

  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 中给出的模式在这里只是透明地编码了字符串由四位数字组成的事实,后跟破折号等,并且具有日期部分的捕获组。如果我们成功匹配,我们将返回我们捕获的内容,这将是日期。如果不是,这不是时间戳,所以我们不要管它。

【讨论】:

  • 好点!现在我需要遍历该字典的所有值(可能有多个节点/级别),并检查模式匹配。有什么想法吗?
  • @Cheknov:广度优先搜索或深度优先搜索。
猜你喜欢
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 2017-02-21
  • 2014-04-09
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多