使用RegEx匹配Python中的IP地址

MHi*_*bin 17 python regex

我正在尝试进行测试以检查sys.argv输入是否与RegEx的IP地址匹配...

作为一个简单的测试,我有以下......

import re

pat = re.compile("\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}")
test = pat.match(hostIP)
if test:
   print "Acceptable ip address"
else:
   print "Unacceptable ip address"
Run Code Online (Sandbox Code Playgroud)

但是,当我将随机值传递给它时,在大多数情况下会返回"可接受的IP地址",除非我有一个基本等同于的"地址" \d+.

Mar*_*ina 31

使用正则表达式验证IP地址是一个坏主意 - 这将通过999.999.999.999作为有效.尝试使用套接字替代这种方法 - 更好的验证,同样简单,如果不容易做的话.

import socket

def valid_ip(address):
    try: 
        socket.inet_aton(address)
        return True
    except:
        return False

print valid_ip('10.10.20.30')
print valid_ip('999.10.20.30')
print valid_ip('gibberish')
Run Code Online (Sandbox Code Playgroud)

如果您真的想要使用parse-the-host方法,那么这段代码将完全执行:

def valid_ip(address):
    try:
        host_bytes = address.split('.')
        valid = [int(b) for b in host_bytes]
        valid = [b for b in valid if b >= 0 and b<=255]
        return len(host_bytes) == 4 and len(valid) == 4
    except:
        return False
Run Code Online (Sandbox Code Playgroud)

  • 正则表达式可以工作,但你的方法更好. (5认同)
  • @Maria - 我相信这里的关键是"匹配"IP地址,例如:"这是10 TB的文件/ DB,**匹配**或_list_你可以找到的IP地址",而不是"_创建一个函数收到一个字符串并返回它是否是一个IP地址_",因此我的解决方案是使用精心设计的正则表达式,就像我们_hate_他们一样. (3认同)
  • 套接字方法对于address ='0.33'返回true! (2认同)

Don*_*sto 21

您必须按以下方式修改正则表达式

pat = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
Run Code Online (Sandbox Code Playgroud)

那是因为.是一个代表"每个角色"的通配符

  • 伙计这不起作用..在给出"绿色勾号"之前测试它.255.255.255.256失败,等等.. (3认同)
  • 顺便说一句:也用 r 前缀字符串,这是一个好习惯:`r"^\d{1,3}..."` (2认同)
  • 这不起作用。它还过滤了这个 - 2.16.840.1 ,它不能是一个 ip (2认同)
  • 它*将*匹配 IPv4 地址。它还会匹配看起来像 IPv4 地址但实际上不是的内容,因此它不是 IPv4 地址验证器。但它对于在 Apache 日志文件等地方解析 IPv4 地址仍然很有价值,其中检索地址字段是目标,而不是验证它。 (2认同)

bur*_*ION 14

ip v4的正则表达式:

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
Run Code Online (Sandbox Code Playgroud)

否则你没有使用有效的IP地址,如999.999.999.999,256.0.0.0等


Dee*_*pak 7

我遇到了相同的情况,我发现使用套接字库有帮助的答案,但它不提供对ipv6地址的支持.找到了更好的方法:

不幸的是它仅适用于python3

import ipaddress

def valid_ip(address):
    try: 
        print ipaddress.ip_address(address)
        return True
    except:
        return False

print valid_ip('10.10.20.30')
print valid_ip('2001:DB8::1')
print valid_ip('gibberish')
Run Code Online (Sandbox Code Playgroud)

  • @rakeshpatanga,是的,它是一个有效的IP地址. (2认同)