为了账号安全,请及时绑定邮箱和手机立即绑定

检查字符串是否与python中的IP地址模式匹配?

检查字符串是否与python中的IP地址模式匹配?

哆啦的时光机 2019-09-02 17:14:55
检查字符串是否与某个模式匹配的最快方法是什么?正则表达式是最好的方法吗?例如,我有一堆字符串,想要检查每一个字符串以查看它们是否是有效的IP地址(在这种情况下有效意味着正确的格式),是使用正则表达式执行此操作的最快方法吗?或者有更快的东西像字符串格式或其他东西。这样的事情是我到目前为止所做的:for st in strs:    if re.match('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', st) != None:       print 'IP!'
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

看起来您正在尝试验证IP地址。正则表达式可能不是最好的工具。


如果您想接受所有有效的IP地址(包括您可能甚至不知道的某些地址都有效),那么您可以使用IPy (源):


from IPy import IP

IP('127.0.0.1')

如果IP地址无效,则会引发异常。


或者你可以使用socket (来源):


import socket

try:

    socket.inet_aton(addr)

    # legal

except socket.error:

    # Not legal

如果你真的只想将IPv4与4个小数部分匹配,那么你可以在dot上进行拆分并测试每个部分是0到255之间的整数。


def validate_ip(s):

    a = s.split('.')

    if len(a) != 4:

        return False

    for x in a:

        if not x.isdigit():

            return False

        i = int(x)

        if i < 0 or i > 255:

            return False

    return True

请注意,您的正则表达式不会执行此额外检查。它将接受999.999.999.999作为有效地址。


查看完整回答
反对 回复 2019-09-02
?
守候你守候我

TA贡献1802条经验 获得超10个赞

我通常是极少数坚持捍卫正则表达式的Python专家之一(他们在Python社区中声名狼借),但这不是其中之一 - 接受(比方说)'333.444.555.666'作为“IP地址”是真的太差了,如果你需要的RE匹配后做更多的检查,多使用稀土的一点是无论如何丢失。所以,我衷心地第二个@Mark的建议:IPy的普遍性和优雅(如果你想要支持IPv6!),字符串操作和int检查,如果你只需要IPv4(但是,请考虑一下这个限制,然后再想一想 - - IPv6的的时间的方式来- )!


def isgoodipv4(s):

    pieces = s.split('.')

    if len(pieces) != 4: return False

    try: return all(0<=int(p)<256 for p in pieces)

    except ValueError: return False

我宁愿这样做而不是一个复杂的RE来匹配0到255之间的数字! - )


查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 830 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信