正则表达式无法正确解析 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. 匹配字符串的第一部分。
  2. 不检查数字格式和值。

匹配字符串的第一部分

下面的测试失败,因为字符串的第一部分 (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 之间,但需要显着扩展当前的正则表达式。以 为例。