首页 > 解决方案 > 正则表达式无法正确解析 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

标签: pythonregexipv4

解决方案


失败的测试似乎有两个原因:

  1. 匹配字符串的第一部分。
  2. 不检查数字格式和值。

匹配字符串的第一部分

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


推荐阅读