Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态双引号";“钥匙”;以文本形式在python中形成有效的JSON字符串_Python_Json_Regex_Double Quotes - Fatal编程技术网

动态双引号";“钥匙”;以文本形式在python中形成有效的JSON字符串

动态双引号";“钥匙”;以文本形式在python中形成有效的JSON字符串,python,json,regex,double-quotes,Python,Json,Regex,Double Quotes,我正在处理网页上JS变量中包含的文本,并使用regex提取字符串,然后使用JSON.loads()将其转换为python中的JSON对象 我遇到的问题是没有引号的“钥匙”。现在,我正在对每个字符串中的每个键进行一系列替换(下面的代码),但我想要的是在将字符串传递到json.loads()之前动态标识任何未引用的键 示例1:字符后面没有空格 示例2:字符后面加空格 示例3,:个字符后加空格 示例4后面带空格:字符和换行符 我需要创建一个模式来标识哪些是键,哪些不是包含字符的随机字符串值,比如st

我正在处理网页上JS变量中包含的文本,并使用regex提取字符串,然后使用JSON.loads()将其转换为python中的JSON对象

我遇到的问题是没有引号的“钥匙”。现在,我正在对每个字符串中的每个键进行一系列替换(下面的代码),但我想要的是在将字符串传递到json.loads()之前动态标识任何未引用的键

示例1:字符后面没有空格 示例2:字符后面加空格 示例3,:个字符后加空格 示例4后面带空格:字符和换行符
我需要创建一个模式来标识哪些是键,哪些不是包含字符的随机字符串值,比如
storeImage
中的字符串链接。换句话说,我希望动态查找键并双引号引用它们,以使用
json.loads()
并返回有效的json对象

我目前正在以这种方式替换文本中的每个键

content = re.sub('storeName:', '"storeName":', content)
content = re.sub('address:', '"address":', content)
content = re.sub('address2:', '"address2":', content)
content = re.sub('city:', '"city":', content)
content = re.sub('storeImage:', '"storeImage":', content)
content = re.sub('state:', '"state":', content)
content = re.sub('phone:', '"phone":', content)
content = re.sub('lat:', '"lat":', content)
content = re.sub('lng:', '"lng":', content)
作为表示有效JSON的字符串返回

json_data = [{"storeName": "testName", "address": "12345 Road", "address2": "Suite 500", "city": "testCity", "storeImage": "http://www.testLink.com", "state": "testState", "phone": "999-999-9999", "lat": 99.9999, "lng": -99.9999}]

我相信有更好的方法可以做到这一点,但我还没有找到或想出一个正则表达式模式来处理这些问题。非常感谢您的帮助

像这样的东西应该可以完成任务:
([{,]\s*)([^':]+)(\s*:)

替换为:
\1“\2”\3


示例:

重复当然是不必要的。您可以将所有内容放入一个正则表达式中:

content = re.sub(r"\b(storeName|address2?|city|storeImage|state|phone|lat|lng):", r'"\1":', content)
\1
在第一组括号中包含匹配项(在本例中仅为括号),因此
“\1”:
用引号将其括起来并加回冒号


注意使用a确保我们只匹配那些精确的单词。

Regex
(\w+\s?:\s?(“?[^,]+”?,?)

重新导入
text='storeName:'testName','
text=re.sub('(\w+\s?:\s?)(“?[^”,]+“?,?)”,“\“\g\:\g”,text)
打印(文本)

输出
“storeName”:“testName”

json。加载
不会创建json对象。它采用有效的json值(可能包括也可能不包括json对象),并返回一个Python值。此外,为什么您的数据首先包含这样破碎的伪JSON?重新编写,这与使用
r'''1:\2'
与替换的
'\'\“\g\:\g'
相同。如果数据包含日期,并且该日期中包含:例如,timestamp\u time::\“2020-06-08 22:40:00.000000 UTC。此正则表达式将其转换为时间戳\”2020-06-08“22”:40:00.000000 UTC感谢您提供链接示例。这是迄今为止我遇到的有关正则表达式的最有用的资源。
json_data4 = '''[
{
    storeName: "testName", 
    address: "12345 Road", 
    address2: "Suite 500", 
    city: "testCity", 
    storeImage: "http://www.testLink.com", 
    state: "testState", 
    phone: "999-999-9999", 
    lat: 99.9999, lng: -99.9999
}]'''
content = re.sub('storeName:', '"storeName":', content)
content = re.sub('address:', '"address":', content)
content = re.sub('address2:', '"address2":', content)
content = re.sub('city:', '"city":', content)
content = re.sub('storeImage:', '"storeImage":', content)
content = re.sub('state:', '"state":', content)
content = re.sub('phone:', '"phone":', content)
content = re.sub('lat:', '"lat":', content)
content = re.sub('lng:', '"lng":', content)
json_data = [{"storeName": "testName", "address": "12345 Road", "address2": "Suite 500", "city": "testCity", "storeImage": "http://www.testLink.com", "state": "testState", "phone": "999-999-9999", "lat": 99.9999, "lng": -99.9999}]
content = re.sub(r"\b(storeName|address2?|city|storeImage|state|phone|lat|lng):", r'"\1":', content)
import re

text = 'storeName: "testName", '
text = re.sub('(\w+)\s?:\s?("?[^",]+"?,?)', "\"\g<1>\":\g<2>", text)
print(text)