【问题标题】:Validate IP address from list从列表中验证 IP 地址
【发布时间】:2012-04-14 11:37:36
【问题描述】:

我想从可能包含格式不正确的地址或其他垃圾的列表中验证 IP 地址。如果该字段不包含格式正确的字段,只需继续忽略该字段即可。

根据How to validate IP address in Python?,似乎有两种方法可以做到这一点,REGEX 或socket.inet_aton()。

下面是尝试使用socket.inet_aton() 解析CSV 并检查该字段是否为IPv4 地址。目前它打印垃圾或格式不正确的 IP 地址。关于打印逆向或正确 IP 地址的 IP 的任何提示?

更新

数字字段不以离散八位字节表示法打印,即 12345 打印。如何过滤掉非八位字节符号?

for data in import_text('data.csv', ','):
    try:
        socket.inet_aton(data)
    except socket.error:
        continue
    print (data)

【问题讨论】:

  • 您想要纠正的到底是什么错误?
  • 我希望 print 语句只返回有效的 IP 地址。目前只返回无效的IP地址或垃圾。
  • 您要打印还是退回?这是完全不同的两件事。
  • 打印,从下面的反馈中更新问题,尽管我现在意识到 socket.inet_aton() 将匹配 111、111.111 或 1111.111.111 111.111.111.111。需要确保它是一个有效的 IP,而不是速记。
  • 12345 是一个完全有效的 IP 地址,它只是写为一个 32 位整数而不是离散的八位字节。

标签: python scripting csv ip


【解决方案1】:

您应该在inet_aton() 呼叫之后立即print:

for data in import_text('data.csv', ','):
    try:
        socket.inet_aton(data)
        # data is ok, otherwise a socket.error would have been raised
        print(data)
    except socket.error:
        continue # if you don't care about "garbage"

每当inet_aton 被输入任何不是有效 IP 的东西时,socket.error 就会被引发,并且控制权会转到 except 块。

【讨论】:

    【解决方案2】:

    打印语句在“except”块中,因此只有在将传递的字符串解析为IP地址出错时才会调用它。

    把for循环的内容改成这样:

    try:
        socket.inet_aton(data)
    except socket.error:
        continue
    
    print (data)
    

    【讨论】:

      【解决方案3】:

      根据手册,inet_aton 接受少于 3 个点的字符串:

      inet_aton() 也接受少于三个点的字符串;有关详细信息,请参阅 Unix 手册页 inet(3)。

      这可能是你在这里发生的事情的一部分。

      【讨论】:

        【解决方案4】:

        如果没有发生异常,则执行try/except 块的else 子句。

        try:
            socket.inet_aton(data)
        except socket.error:
            pass
        else:
            print(data)
        

        但由于您需要将其表示为离散的八位字节,因此您最好的方法不是正则表达式,也不是 socket.inet_aton,而是一个简单的验证函数:

        def valid_ip(addr):
            try:
                addr = addr.strip().split(".")
            except AttributeError:
                return False
            try:
                return len(addr) == 4 and all(octet.isdigit() and int(octet) < 256
                                              for octet in addr)
            except ValueError:
                return False
        

        那就是:

        if valid_ip(data):
            print data
        

        【讨论】:

        • valid_ip("-1.-1.-1.-1") == True?
        猜你喜欢
        • 1970-01-01
        • 2012-02-29
        • 1970-01-01
        • 1970-01-01
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多