当字符串包含正则表达式时,Python编码特殊的JSON字符?

问题描述:

有谁知道一种方法来让json.dumps正确地编码一个包含正则表达式的字符串吗?或者,如果有一种替代方法来编码JSON有效载荷的数据,而JSON有效载荷不会使用能够正确处理这种情况的json.dumps?当字符串包含正则表达式时,Python编码特殊的JSON字符?

例如:

import json 
MyString = 'regex "Network\sInformation:[\s\S]+?Workstation\sName:\t+(?<src_host>[^\r]+)"' 
data = {} 
data['MyString'] = MyString 
data['date'] = '2017-09-18T11:28:06' 
json_data = json.dumps(data) 
print json_data 

会生成:

{ 
    "date": "2017-09-18T11:28:06", 
    "MyString": "regex \"Network\\sInformation:[\\s\\S]+?Workstation\\sName:\t+(?<src_host>[^\r]+)\"" 
} 

但是,你会发现[^\r]不正确转义,应[^\\r],当通过API处理结果在解析错误。

在年底,JSON有效载荷我在这里建设将使用请求,类似这样被提交给Web API:

requests.post(url, auth=(uname, passwd), data=json_data, headers=headers) 

注:我认为简单地创建一个函数,发出一串替换命令手动编码这个我自己,这是我目前的计划B,但我希望已经有一个解决方案/模块在那里,我可以利用它来做到这一点。

你的正则表达式定义是有缺陷的,而不是JSON输出:

>>> MyString = 'regex "Network\sInformation:[\s\S]+?Workstation\sName:\t+(?<src_host>[^\r]+)"' 
>>> MyString[-5:-4] 
'\r' 
>>> len(MyString[-5:-4]) 
1 
>>> print(MyString[-5:-4]) # produces an empty line 

你定义一个回车,不是一个单独的反斜线和r性格; Python将这两者解释为转义序列。 JSON进行编码与\r是回车太:

>>> import json 
>>> chr(13) # ASCII code 13 is a carriage return 
'\r' 
>>> print(json.dumps(chr(13))) 
"\r" 

使用原始字符串字面量来代替:

MyString = r'regex "Network\sInformation:[\s\S]+?Workstation\sName:\t+(?<src_host>[^\r]+)"' 

现在你有两个单独的字符,\r

>>> MyString = r'regex "Network\sInformation:[\s\S]+?Workstation\sName:\t+(?<src_host>[^\r]+)"' 
>>> MyString[-6:-4] 
'\\r' 
>>> len(MyString[-6:-4]) 
2 
>>> print(MyString[-6:-4]) 
\r 

和这两个字符会产生您预期的JSON输出:

>>> import json 
>>> print(json.dumps(MyString)) 
"regex \"Network\\sInformation:[\\s\\S]+?Workstation\\sName:\\t+(?<src_host>[^\\r]+)\"" 
+1

doh !!!谢谢!这是非常有意义的,一切都是正确的世界。 – user3246693