正则表达式无法正确解析 IPv4 输入
Regex fails to correctly parse IPv4 inputs
我正在尝试在 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
这是我的代码。它基本上 returns 一个布尔值:
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
returns 一个对象在字符串的第一部分匹配时。来自 docs:
If zero or more characters at the beginning of string match this
regular expression, return a corresponding match object.
如果您只想在 整个 字符串匹配时使用对象,请使用 fullmatch
。来自 docs:
If the whole string matches this regular expression, return a
corresponding match object. Return None if the string does not match
the pattern; note that this is different from a zero-length match.
或者,您可以将 $
附加到原始正则表达式以匹配 line/string 的末尾。例如,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 之间,但需要显着扩展当前的正则表达式。以 为例。
我正在尝试在 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
这是我的代码。它基本上 returns 一个布尔值:
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
returns 一个对象在字符串的第一部分匹配时。来自 docs:
If zero or more characters at the beginning of string match this regular expression, return a corresponding match object.
如果您只想在 整个 字符串匹配时使用对象,请使用 fullmatch
。来自 docs:
If the whole string matches this regular expression, return a corresponding match object. Return None if the string does not match the pattern; note that this is different from a zero-length match.
或者,您可以将 $
附加到原始正则表达式以匹配 line/string 的末尾。例如,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 之间,但需要显着扩展当前的正则表达式。以