Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.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 将单引号替换为双引号,但保留双引号内的引号不变_Python - Fatal编程技术网

Python 将单引号替换为双引号,但保留双引号内的引号不变

Python 将单引号替换为双引号,但保留双引号内的引号不变,python,Python,问题的最终目标或根源是让一个字段与json\u extract\u path\u text红移兼容 这就是它现在的样子: {'error':“提要加载失败:参数'url'必须是字符串,而不是对象”,'errorCode':3,'event_origin':'app','screen_id':'611896422787465','screen_class':'Promotion'} 为了从红移中的字符串中提取所需的字段,我将单引号替换为双引号。 特定的记录给出了错误,因为在error的值中有一个

问题的最终目标或根源是让一个字段与json\u extract\u path\u text红移兼容

这就是它现在的样子:

{'error':“提要加载失败:参数'url'必须是字符串,而不是对象”,'errorCode':3,'event_origin':'app','screen_id':'611896422787465','screen_class':'Promotion'}
为了从红移中的字符串中提取所需的字段,我将单引号替换为双引号。 特定的记录给出了错误,因为在error的值中有一个单引号。这样,如果这些字符串也被替换,那么该字符串将是无效的json

所以我需要的是:

{“error”:“Feed load failed:参数“url”必须是字符串,而不是对象”,“errorCode”:3,“event_origin”:“app”,“screen_id”:“611896422787465”,“screen_class”:“Promotion”}

有几种方法,一种是将
regex
模块与

"[^"]*"(*SKIP)(*FAIL)|'
看。
在Python中:

import regex as re

rx = re.compile(r'"[^"]*"(*SKIP)(*FAIL)|\'')
new_string = rx.sub('"', old_string)

对于原始的
re
模块,您需要使用一个函数来查看组是否匹配-
(*SKIP)(*FAIL)
让您完全避免了这一点。

我尝试了一种正则表达式方法,但发现它复杂且缓慢。因此,我编写了一个简单的“括号解析器”,它跟踪当前的引用模式。它不能进行多次嵌套,因此需要一个堆栈。对于将str(dict)转换为正确的JSON的用例,它可以工作:

输入示例:
{'cities':[{'name':“上地狱之门”},{'name':“N'zeto”}}

示例输出:
{“城市”:[{“名字”:“上地狱之门”},{“名字”:“N'zeto”}]}'

python单元测试

def testSingleToDoubleQuote(self):
jsonStr=''
{
“城市”:[
{
“名称”:“上地狱之门”
},
{
“姓名”:“N'zeto”
}
]
}
'''
listOfDicts=json.loads(jsonStr)
dictStr=str(listOfDicts)
如果self.debug:
打印(dictStr)
jsonStr2=JSONAble.singleQuoteToDoubleQuote(dictStr)
如果self.debug:
打印(jsonStr2)
self.assertEqual(''{“cities”:[{“name”:“上地狱之门”},{“name”:“N'zeto”}]}',jsonStr2)
singlequote到doublequote

def singlequote双引号(singlequote):
'''
将单引号字符串转换为双引号字符串
Args:
单引号(string):单引号字符串,例如{'cities':[{'name':“上地狱之门”}]}
返回:
字符串:字符串的双引号版本,例如。
看见
- https://stackoverflow.com/questions/55600788/python-replace-single-quotes-with-double-quotes-but-leave-ones-within-double-q 
'''
cList=列表(单引号)
不可靠=错误;
inSingle=假;
对于枚举中的i,c(cList):
#打印(“%d:%s%r%r”%(i、c、单体、双体))
如果c==“'”:
如果不是不可动摇的:
inSingle=非inSingle
cList[i]=“”
elif c=='“':
不可逆的
doubleQuoted=“”.join(cList)
返回双引号

您是否尝试了
json.dumps(d)
?如果在单引号中找到单引号,则会出现问题。i、 e.:
“{'cities':[{'name':'Upper Hell's Gate'}]”
=>
“{”cities:[{'name:“Upper Hell”s Gate'}]“
。此外,单元测试中的jsonStr似乎没有经过任何转换。除了双引号外,没有单引号。regex应该不会太慢,如果您的用例不同,可以使用其他pcre引擎/语言。在我的用例中,单引号中的单引号是不可能发生的。这将是python和JSON的语法错误。