微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

正则表达式无法正确解析IPv4输入

如何解决正则表达式无法正确解析IPv4输入

我正在尝试在Python中构建IPv4正则表达式。这就是我所拥有的:

r'\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}')
    
    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返回一个对象。来自this

如果字符串开头的零个或多个字符与此匹配 正则表达式,返回相应的匹配对象。

如果只在整个字符串匹配时需要一个对象,请使用fullmatch。来自docs

如果整个字符串与此正则表达式匹配,则返回 对应的匹配对象。如果字符串不匹配,则返回None 模式请注意,这与零长度匹配不同。

或者,您可以将$附加到原始正则表达式中,以匹配行/字符串的结尾。例如r'\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之间,但是需要显着扩展当前的正则表达式。参见docs作为示例。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。