当字符串包含正则表达式时,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]+)\""
doh !!!谢谢!这是非常有意义的,一切都是正确的世界。 – user3246693