python - 正则表达式将 IP 与 jsonschema 中的掩码进行匹配

标签 python json regex jsonschema

有一个很好的解决办法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并尝试使用 ujson 而不是 json (在 python 中),如建议的 here ,但没有任何效果。

以下 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])$

所以在 JSON 模式中,它看起来像:

"pattern": "((^|\\.)((25[0-5])|(2[0-4]\\d)|(1\\d\\d)|([1-9]?\\d))){4}\\/(?:\\d|[12]\\d|3[01])$"

无论如何,您发现的正则表达式(在链接中)与数字分组不太匹配。尝试举几个例子 - 完全匹配是正确的,但返回的包含带数字的点或仅包含点。

如果您想要 IP 地址的所有部分而不仅仅是完整匹配,那么这里有一个正则表达式 based on this one 。我已经包含了可选子网掩码的匹配:

^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
(?:\/(\d|[12]\d|3[01]))?$

(删除我为便于阅读而添加的换行符。)Demo here 。只有前 3 个地址应该匹配,其余的不匹配。

如果您只想要完整的匹配,而不是各个部分,请使用:

^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
(?:\/(?:\d|[12]\d|3[01]))?$

关于python - 正则表达式将 IP 与 jsonschema 中的掩码进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53212067/

相关文章:

python - 将 Python 数组分割成由单个单元格或更少单元格连接的独特区域?

python 列表理解 : gathering duplicate columns

javascript - 单击保存多次

java - 对象序列化为 JSON(使用 Gson)。如何在 UpperCamelCase 中设置字段名称?

python - 从 pandas 列中存储的 url 中提取子字符串

python - 如何使用 Deap 最小化函数?

python - 从命令提示符运行 python 脚本时没有模块错误

javascript - Chrome 推送通知

javascript - 用于范围和增量检查的正则表达式

java - 正则表达式中的重复模式