在Python中围绕冒号前面的单词添加引号

在Python中围绕冒号前面的单词添加引号,python,find-replace,Python,Find Replace,我正在学习Python python3,正在使用一个包含半JSON格式的文本文件。它不是完整的JSON,因为键没有被引号包围。我希望以编程方式在所有这些键名周围添加引号。我的计划是打开这个文件,并将每一行解析为一个单独的字符串 发件人: key\u name:{另一个key:somevalue,第二个key:anotherval} 进入: key\u name:{另一个key:somevalue,第二个key:anotherval} 我相信正则表达式将是实现这一点的理想方法-为了学习,我一直在使

我正在学习Python python3,正在使用一个包含半JSON格式的文本文件。它不是完整的JSON,因为键没有被引号包围。我希望以编程方式在所有这些键名周围添加引号。我的计划是打开这个文件,并将每一行解析为一个单独的字符串

发件人:

key\u name:{另一个key:somevalue,第二个key:anotherval}

进入:

key\u name:{另一个key:somevalue,第二个key:anotherval}

我相信正则表达式将是实现这一点的理想方法-为了学习,我一直在使用数组

我有一些部分工作的代码,但不是所有的键都有括号

str = "this is: a string: testing testing: blah blah more: test: hereis: test:"

cp_str = list(str[::-1])

skip = False
find_end = False
for step in range(len(cp_str) - 1):
  if skip:    
    skip = False
    continue

  if cp_str[step] == ':':    
    cp_str.insert(step + 1, '"')
    skip = True
    find_end = True

  if not skip and find_end and not(ord(cp_str[step].lower()) > 95 and ord(cp_str[step].lower()) < 95+26):    
    cp_str.insert(step, '"')
    skip = True
    find_end = False

print(''.join(cp_str[::-1]))
产出:

这是:一个字符串:测试测试:诸如此类诸如此类: 测试:这里是:测试:

任何关于解决此问题的最佳方法的提示或帮助都将不胜感激。

虽然模式[{,]\s*[^]*?\s*:\s*不能涵盖所有的极端情况,但对于基本的JSON内容,它应该可以很好地工作

用法示例:

>>> import re
>>> data = '{ another_key: "somevalue", second_key: "anotherval" }'
>>> repl_fn = lambda x: f'{x.group(1)}"{x.group(2)}"{x.group(3)}'
>>> re.sub(r'([{,]\s*)([^"]*?)(\s*:\s*)', repl_fn, data)
'{ "another_key": "somevalue", "second_key": "anotherval" }'
虽然模式[{,]\s*[^]*?\s*:\s*不能涵盖所有的情况,但对于基本的JSON内容,它应该可以很好地工作

用法示例:

>>> import re
>>> data = '{ another_key: "somevalue", second_key: "anotherval" }'
>>> repl_fn = lambda x: f'{x.group(1)}"{x.group(2)}"{x.group(3)}'
>>> re.sub(r'([{,]\s*)([^"]*?)(\s*:\s*)', repl_fn, data)
'{ "another_key": "somevalue", "second_key": "anotherval" }'

避免使用正则表达式处理结构化格式。它几乎总是会错误处理某些特殊情况

由于您的输入是有效的YAML,因此您可以安装输入,将其加载为YAML,并将数据结构转储为JSON:

import yaml
import json
s = 'key_name: { another_key: "somevalue", second_key: "anotherval" }'
print(json.dumps(yaml.load(s)))
这将产生:

{"key_name": {"another_key": "somevalue", "second_key": "anotherval"}}

避免使用正则表达式处理结构化格式。它几乎总是会错误处理某些特殊情况

由于您的输入是有效的YAML,因此您可以安装输入,将其加载为YAML,并将数据结构转储为JSON:

import yaml
import json
s = 'key_name: { another_key: "somevalue", second_key: "anotherval" }'
print(json.dumps(yaml.load(s)))
这将产生:

{"key_name": {"another_key": "somevalue", "second_key": "anotherval"}}

您的示例代码是:字符串与JSON没有太多关系,没有任何逗号或括号,因此我认为对其进行测试并不能证明程序能够将JSON文件中的非引号键转换为引号键。我甚至不太清楚输出应该是什么。我建议坚持使用y我们的最上面的例子。是的,从技术上说你是对的?然而,我的想法是分别解析文件的每一行,从而处理一个字符串。事实上,你的最上面的例子也不是有效的JSON,因为有一个键名漂浮在空间中。我建议你澄清你的输入到底是什么,否则追逐任意边缘是徒劳的案例。我不认为这是处理JSON格式的最佳方式。我会导入JSON包并简单地使用JSON。dumpsIt假设OP没有权限写入JSON,必须处理读取无效JSON的问题。JSON.loads无法做到这一点。您的示例代码是:字符串与JSON没有多大关系,没有任何字符串逗号或方括号,所以我不认为用它进行测试可以证明程序能够将一个几乎JSON文件中的非引号键转换为引号键。我甚至不太清楚输出应该是什么。我建议坚持你的最上面的示例。是的,技术上你是对的?但是,我的想法是解析每一行实际上,你的顶级示例也不是有效的JSON,因为有一个key_名称漂浮在空间中。我建议你澄清你的输入到底是什么,否则追查任意的边缘情况有点徒劳。我认为这不是处理JSON格式的最佳方法。我会改为导入json包并简单地使用json。dumpsIt假设OP没有写入json的权限,必须处理读取无效json的问题。json.loads无法做到这一点。您忘记了在regexp中转义。您是对的。我通过copy paste.Fixed更新了代码。我的意图是允许已正确引用的键保留在lone。你忘了在regexp中转义。你是对的。我通过复制粘贴更新了代码。修复了。我的目的是让已经正确引用的键可以单独使用。这似乎是一个不错的选择。我没有太多使用YAML,但会检查一下。谢谢这似乎是一个不错的选择。我没有太多使用YAML,但会检查这个选项t、 谢谢