【问题标题】:Python Encode Special JSON characters when string contain regex?当字符串包含正则表达式时,Python编码特殊的JSON字符?
【发布时间】:2017-10-16 17:55:01
【问题描述】:

有谁知道让 json.dumps 正确编码包含正则表达式的字符串的方法?或者,是否有另一种方法可以为不使用 json.dumps 的 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,但我希望那里已经有一个解决方案/模块,我可以利用来做到这一点。

【问题讨论】:

    标签: python json regex python-requests


    【解决方案1】:

    您的正则表达式定义有缺陷,而不是 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]+)\""
    

    【讨论】:

      猜你喜欢
      • 2020-04-26
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多