假设是IPv4地址,请尝试提取数字和关键标点符号。然后在必要时将有效结果切片。另外,验证ip地址可能是一种更安全的方法。在
在Python 3中:
编码import string
import ipaddress
def validate_port(func):
"""Return the results or raise and exception for invalid ports."""
def wrapper(arg):
result = func(arg)
if len(result) == 2 and not result[-1].isdigit():
raise ValueError("Invalid port number.")
return result
return wrapper
@validate_port
def discover_device(device):
"""Return a list of ip and optional port number. Raise exception for invalid ip."""
result = "".join(i for i in device if i in (string.digits +".:")).strip(":").split(":")
try:
ipaddress.ip_address(result[0])
except ValueError as e:
# Numbers in the device name (index 0) or invalid ip
try:
ipaddress.ip_address(result[1])
except IndexError:
raise e
else:
return result[1:]
else:
return result
演示
^{pr2}$
功能对周围字符不敏感
ip地址验证(非IPv6)和异常处理
防止设备名称中的数字
验证端口号(可选)
详情
通常,result是一个包含ip和可选端口号的列表。但是,如果设备名称中有数字,结果的第一个索引将包括不需要的数字。以下是result的示例:
^{3}$
异常处理测试设备名称中的数字,并验证第一个或第二个索引中的ip地址。如果找不到,则引发异常。在
虽然验证端口号超出了问题的范围,但是端口被假定为一个数字。向validate_port装饰器添加了一个简单的测试,可以根据需要应用或更新它。decorator筛选来自discover_device()的输出。如果端口不是纯数字,则引发异常。{有关修改^的限制,请参见}。请参见this blog以获得关于Python装饰器的优秀教程。在
选项
如果验证不是问题,只要设备名中没有".",以下代码就足够了:def discover_device(device):
result = "".join(i for i in device if i in (string.digits +".:")).strip(":").split(":")
if "." not in result[0]:
return result[1:]
return result
如果首选非装饰解决方案,请定义以下函数:def validate_port(result):
"""Return the results or raise and exception for invalid ports."""
if len(result) == 2 and not result[-1].isdigit():
raise ValueError("Invalid port number.")
return result
现在将discover_device()的返回值传递给后一个函数,即return validate_port(result[1:])和{}。在
向@coder咨询建议。在