使用 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"]}}
我想做的基本上是重新格式化字符串并使其通过 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"]}}