python - 正则表达式无法正确解析 IPv4 输入
问题描述
我正在尝试在 Python 中构建 IPv4 正则表达式。这就是我所拥有的:
r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
这些是它错误分类的输入:
Input: "172.316.254.1"
Output: true
Expected Output: false
Input: "1.1.1.1a"
Output: true
Expected Output: false
Input: "1.23.256.255."
Output: true
Expected Output: false
Input: "64.233.161.00"
Output: true
Expected Output: false
Input: "64.00.161.131"
Output: true
Expected Output: false
Input: "01.233.161.131"
Output: true
Expected Output: false
Input: "1.1.1.1.1"
Output: true
Expected Output: false
Input: "1.256.1.1"
Output: true
Expected Output: false
Input: "1.256.1.1"
Output: true
Expected Output: false
Input: "255.255.255.255abcdekjhf"
Output: true
Expected Output: false
这是我拥有的代码。它基本上返回一个布尔值:
import re
def isIPv4Address(inputString):
pattern = re.compile(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
return pattern.match(inputString) is not None
解决方案
失败的测试似乎有两个原因:
- 匹配字符串的第一部分。
- 不检查数字格式和值。
匹配字符串的第一部分
下面的测试失败,因为字符串 ( ) 的第一部分1.1.1.1
与您的正则表达式匹配。附加内容a
不会改变:
Input: "1.1.1.1a"
Output: true
Expected Output: false
发生这种情况是因为match
当字符串的第一部分匹配时返回一个对象。从文档:
如果字符串开头的零个或多个字符匹配此正则表达式,则返回相应的匹配对象。
如果fullmatch
您只需要一个对象,则在整个字符串匹配时使用。从文档:
如果整个字符串匹配这个正则表达式,则返回一个对应的匹配对象。如果字符串与模式不匹配,则返回 None;请注意,这与零长度匹配不同。
或者,您可以附加$
到原始正则表达式以匹配行/字符串的结尾。例如,r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'
数字格式和值
下面的测试失败,因为您的正则表达式不检查数字的格式或值。\d{1,3}
仅检查是否有 1 到 3 位数字。这匹配从 000 到 0 到 9 到 999 的所有值。
Input: "01.233.161.131"
Output: true
Expected Output: false
检查值是否在 0 和 255 之间可以使用正则表达式完成,但需要显着扩展当前的正则表达式。以这个答案为例。
推荐阅读
- c - 将 C-Function 编译到 Postgres 时出现问题;编译器没有找到 postgres.h
- node.js - node.js 仅在服务器端使用会话值
- ubuntu - 如何将我的 Ubuntu 服务器链接到我的 GitHub 存储库?
- jenkins - 格里特詹金斯集成
- c# - 我需要从字符串中删除所有符号以创建忽略标点符号的`IEqualityComparer`
- node.js - 在 Nginx 上运行 NuxtJS 应用程序时出现 504 网关超时错误
- azure - 如何为 Azure 发布管道配置包文件路径?
- android - Kotlin 协程:尝试在空对象引用上调用虚拟方法“void androidx.lifecycle.MutableLiveData.postValue(java.lang.Object)”
- sql - 如何有效地将树状数据结构插入 postgres
- c - 如何在 C 中定义结构并为其正确分配内存?