【发布时间】:2019-04-12 05:12:30
【问题描述】:
有一个很好的解决方案here 可以匹配带有掩码的IP,例如192.168.0.1/24。我添加了来自https://regex101.com/ 的建议来转义斜线,它看起来像这样:
((^|\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]?\d))){4}\/(?:\d|[12]\d|3[01])$
这似乎确实适用于 regex101。
它需要存在于一个 json 文件(jsonschema 文件)中,但似乎包含一些非法的东西。无法弄清楚它是什么,查看了this、this、this,还尝试按照here 的建议使用 ujson 而不是 json(在 python 中),但没有任何效果。
以下包含该正则表达式的 jsonschema:
{
"comment": "ipv4 with a mask",
"data": {
"network": {
}
},
"schema": {
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "ipv4 with a mask",
"type": "object",
"properties": {
"subnet": {
"title": "subnet",
"type": "string",
"pattern": "((^|\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]?\d))){4}\/(?:\d|[12]\d|3[01])$"
}
}
}
}
...不幸的是甚至不会解析。 Python 在说:
JSONDecodeError: Invalid \escape: line 16 column 33 (char 380)
我一直在使用库 fastjsonschema 来检查这些东西,但甚至无法解析 json 并获得那么远。
有谁知道如何解决这个问题,以某种方式让那段正则表达式在 jsonschema 中起作用?
【问题讨论】:
-
Json 不喜欢反斜杠,所以你必须将它们转义
((^|\\.)((25[0-5])|(2[0-4]\\d)|(1\\d\\d)|([1-9]?\\d))){4}\\\/(?:\\d|[12]\\d|3[01])$使用像 jsonschemavalidator.net 这样的网站来检查你的架构 -
@TomPowis 我只是将您的字符串放入 json 中,但 python 中的解析器仍然不满意。 @IvanGodko 今天早些时候正在查看它,但相信它会验证
192.168.0.1而不是192.168.0.1/24 -
也许将其保存为原始字符串?
r"..."那当然不用转义了 -
@TomPowis 在您的 JSON 转义正则表达式字符串中,
{4}之后有一个额外的反斜杠。
标签: python json regex jsonschema