在python中动态双引号“keys”以形成有效的JSON字符串

2024-09-30 01:19:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理网页上JS变量中包含的文本,并使用regex提取字符串,然后使用json.loads(). 在

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

例1后面没有空格:character

json_data1 = '[{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}]'

例2后面有空格:character

^{pr2}$

示例3,:characters

json_data3 = '[{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}]'

示例4:字符和换行符

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
}]'''

我需要创建一个模式来标识哪些是键,而不是包含诸如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}]

我确信有更好的方法来实现这一点,但我还没有找到或想出一个regex模式来处理这些问题。非常感谢任何帮助!在


Tags: 字符串rejsoncityaddressphonecontentstate
3条回答

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

content = re.sub(r"\b(storeName|address2?|city|storeImage|state|phone|lat|lng):", r'"\1":', content)

\1包含第一组括号内的匹配项(在本例中,仅限于此),因此"\1":用引号将其括起来并加上冒号。在

注意使用word boundary anchor来确保我们只匹配那些确切的单词。在

正则表达式(\w+)\s?:\s?("?[^",]+"?,?)

Regex demo

import re

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

输出"storeName":"testName",

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

替换为:\1"\2"\3

示例:https://regex101.com/r/oV0udR/1

相关问题 更多 >

    热门问题