【问题标题】:Unable to read regex in a JSON file as a string in Python无法将 JSON 文件中的正则表达式作为 Python 中的字符串读取
【发布时间】:2016-11-07 03:01:22
【问题描述】:

我需要将下面的 JSON 文件读入 Python,并保持正则表达式完整。我将在程序中使用正则表达式。

{
    "Title": "Sample Compliance Check",
    "Checks": {
        "6": {
            "+": ["^interfa.*", "^ip address 192\.168\.0"],
            "description": "All interfaces with IP Address 192.168.0",
            "action": "aaa new-model"
        }
    }
}

当我尝试使用 json 模块阅读此内容时,我收到了无效 json 的错误。

json.decoder.JSONDecodeError: Invalid \escape: 

我尝试将反斜杠转换为双反斜杠

{
    "Title": "Sample Compliance Check",
    "Checks": {
        "6": {
            "+": ["^interfa.*", "^ip address 192\\.168\\.0"],
            "description": "All interfaces with IP Address 192.168.0",
            "action": "aaa new-model"
        }
    }
}

现在,它在 Python 中被读取,但我得到了带有双反斜杠的相同输出。

有什么方法可以在 JSON 中对正则表达式进行编码并像编码一样读取它(以原始正则表达式形式)?

【问题讨论】:

  • 您显示的不是有效的 json。你能给出一个最小的工作示例和你得到的回溯吗?
  • 这里是有效的部分: { "Title": "Sample Compliance Check", "Checks": { "6": { "+": ["^interfa.*", "^ ip address 192\\.168\\.0"], "description": "IP 地址为 192.168.0 的所有接口", "action": "aaa new-model" } } }
  • 字符串"^ip address 192\\.168\\.0" 确实只有一个反斜杠。它们显示为双精度,以便 Python 可以将它们与转义字符区分开来,但它应该是您想要的正则表达式 ("^ip address 192\.168\.0")
  • @syntonym 大概是一个较大文件的片段,但里面的东西是有效的。
  • @SuperBiasedMan 我认为问题可能在于如何读取 json。当然你是正确的,那是(可能)有效 json 文件的片段,但它本身不是有效的 json。

标签: python json regex


【解决方案1】:

python 中的原始字符串格式化和“普通字符串格式化”不会改变字符串的存储方式,而只会改变输入字符串的方式。所以下面的字符串都是相等的:

"\\a" == r"\a"

Python 会向您显示转义的反斜杠,但如果您尝试使用正则表达式,您会发现它与您想要匹配的内容匹配。

>>> bool(re.match("^ip address 192\\.168\\.0", "ip address 192.168.0"))
True

【讨论】:

  • 感谢您的澄清。我从 json 文件中得到的字符串是 unicode:u'^ip address 192\\.168\\.0' 所以当我尝试在正则表达式中使用它时它不起作用。我想我必须将其解码为 utf-8,对吗?还是有其他方法?
  • @rahulverma:很奇怪。您不需要将正则表达式解码为 UTF-8,re 模块可以正确处理 Unicode 字符串,即使在 Python 2 中也是如此。FWIW、bool(re.match(u"^ip address 192\\.168\\.0", "ip address 192.168.0.100"))bool(re.match(u"^ip address 192\\.168\\.0", u"ip address 192.168.0.100")) 在 Python 2.6 和 Python 3.6 上都可以正常工作。
  • @PM2Ring:你是对的!问题出在正则表达式本身。非常感谢。
猜你喜欢
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多