使用 python 正则表达式重新格式化字符串以模拟 json

Reformatting a string to simulate a json using python regex

我想做的基本上是重新格式化字符串并使其通过 jsonschema 验证函数。

从表面上看很简单。然而,棘手的部分是字符串是从文件中读取的,并且其外观和格式可能会有所不同。

例如

{
    key:"value",
    ...
}

{
    "key":'value'
    ,... 
}

或单引号、双引号、无引号、数组、字符串等的任何可能组合,并且可能包含撇号等。

我想对正则表达式规则足够自由,并将输入数据视为非结构化数据,将在 运行 时间传递的代码格式化为统一格式,以检查其质量。

使用 python,到目前为止,我的方法是尝试迭代我希望执行的最常见的转换 - 但是,我知道我想做的是可以实现的,可能非常明显并且尽管我还没有完成它,但我想我会尝试减轻头痛并寻求一些帮助。

这里有一个更详尽的示例(已尝试演示我目前发现的大部分问题):

{
    key_a:'my value',
    key_b:"my other value"
    ,nested_value_a:{
        sub_a: "value a",
        'sub_b':'value b',
        "sub_c":'isn't value b very interesting'
    }
    ,key_c:{ 
        sub_d: ["value"],
        sub_e:   ["value"]
        },
}

我想要的输出:

{
    "key_a":"my value",
    "key_b":"my other value"
    ,"nested_value_a":{
        "sub_a": "value a",
        "sub_b":"value b",
        "sub_c":"isn\"t value b very interesting"
    }
    ,"key_c":{ 
        "sub_d": ["value"],
        "sub_e":   ["value"]
        }
}

我已经尝试 this 作为我的第一步 - 但我确信我正在努力解决这个问题。我想尝试结合否定先行和后行,这样我就可以在全局范围内将所有单引号换成双引号,避免单引号夹在两个字母之间的情况——但我认为我不够聪明,无法获得靠我自己。 非常感谢大家的帮助。

谢谢

你在考虑字符串时对“不是”这个词有一点疑问

f = """{
    key_a:'my value',
    key_b:"my other value"
    ,nested_value_a:{
        sub_a: "value a",
        'sub_b':'value b',
        "sub_c":'isn't value b very interesting'
    }
    ,key_c:{ 
        sub_d: ["value"],
        sub_e:   ["value"]
        }
}"""

现在,您可以这样做:

f = f.replace("\'","\"")
f =  f.replace("\"t","\'t")
print(f)

这将产生这个字符串

f= {
    key_a:"my value",
    key_b:"my other value"
    ,nested_value_a:{
        sub_a: "value a",
        "sub_b":"value b",
        "sub_c":"isn\'t value b very interesting"
    }
    ,key_c:{ 
        sub_d: ["value"],
        sub_e:   ["value"]
        }
}

不,最美的事情。在此之后,您只需执行以下操作(您需要导入 dirtyjson):

import dirtyjson

d = dirtyjson.loads(f)
json = json.dumps(d, sort_keys=False)

这给了你

{"key_a": "my value", "key_b": "my other value", "nested_value_a": {"sub_a": "value a", "sub_b": "value b", "sub_c": "isn't value b very interesting"}, "key_c": {"sub_d": ["value"], "sub_e": ["value"]}}