【问题标题】:Using a RegEx to match IP addresses使用 RegEx 匹配 IP 地址
【发布时间】:2012-07-01 02:47:13
【问题描述】:

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

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

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"

但是,当我向其中传递随机值时,在大多数情况下它会返回“可接受的 IP 地址”,除非我的“地址”基本上等同于 \d+

【问题讨论】:

标签: python regex


【解决方案1】:

使用正则表达式验证 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')

如果您真的想改用解析主机方法,这段代码将完全做到这一点:

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

【讨论】:

  • 是的......你可以写一个匹配“0”到“255”的可怕正则表达式,但最好避免它:)
  • 我也为这种方法加了1(大约一个小时前赞成:)
  • socket 方法为 address='0.33' 返回 true!
  • @Maria - 我相信这里的关键是“匹配”IP 地址,例如:“这是 10 TB 文件/数据库,matchlist 你可以找到的 IP 地址”,而不是“创建一个接收字符串并返回它是否是 IP 地址的函数”,因此我的解决方案是使用一个好-精心制作的正则表达式,就像我们讨厌它们..
  • @Speedbird - OP 在 sys.argv 中指定检查 IP 地址。因此,我相信正则表达式不是正确的选择。我同意,如果您需要处理大型文件/数据库,那么正则表达式将是一个不错的选择。 :)
【解决方案2】:

您必须通过以下方式修改您的正则表达式

pat = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")

那是因为. 是一个通配符,代表“每个字符”

【讨论】:

  • 为了确保字符串与提供的完全一致,您可以将^ 添加到开头,将$ 添加到末尾。否则,它可能会匹配您不想要的字符串,例如 10.0.0.1:1234
  • 顺便说一句:在字符串前面也加上 r,这是一个好习惯:r"^\d{1,3}..."
  • 伙计们,这不起作用..在给出“绿色勾号”之前对其进行测试。 255.255.255.256 失败,以此类推..
  • 这不起作用。它还会过滤这个 - 2.16.840.1 ,它不能是一个 ip
  • 匹配 IPv4 地址。它还将匹配看起来像 IPv4 地址但不是的东西,因此它不是 IPv4 地址验证器。但它对于在诸如 Apache 日志文件之类的地方解析 IPv4 地址仍然很有价值,其中检索地址字段是目标,而不是验证它。
【解决方案3】:

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]?)$

否则您将使用无效的 IP 地址,例如 999.999.999.999、256.0.0.0 等

【讨论】:

  • 哇!我想我会坚持使用套接字方法,不过谢谢.. 我实际上会注意到这一点...我想知道它会是什么样子。 :-)
  • 酷。如果不是在 Python 中使用,而是在 PRCE 中使用,使用子例程可能会更短一些:^((25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})\.){3}(?2)$regex101.com/r/sE3hK5/1
  • 我认为你在第一组之后有错误。您正在转义 \ 而不是 dot 并且您让它以这种方式获取任何类型的字符。这是我所做的修复:regexper.com/…
  • 这看起来比有效答案好得多,但是带有前导零的 ips 地址将错误匹配,例如001.001.001.1 在典型库中使用时无效
【解决方案4】:

我遇到了同样的情况,我发现使用套接字库的答案很有帮助,但它不提供对 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'))

【讨论】:

  • 这也将返回 0.0.0.0
  • @rakeshpatanga,是的,这是一个有效的 IP 地址。
【解决方案5】:

您正在尝试使用 .作为一个 。不作为任何字符的通配符。请改用\. 来表示句点。

【讨论】:

    【解决方案6】:
    def ipcheck():
    # 1.Validate the ip adderess
    input_ip = input('Enter the ip:')
    flag = 0
    
    pattern = "^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$"
    match = re.match(pattern, input_ip)
    if (match):
        field = input_ip.split(".")
        for i in range(0, len(field)):
            if (int(field[i]) < 256):
                flag += 1
            else:
                flag = 0
    if (flag == 4):
        print("valid ip")
    else:
        print('No match for ip or not a valid ip')
    

    【讨论】:

      【解决方案7】:
      import re
      ipv=raw_input("Enter an ip address")
      a=ipv.split('.')
      s=str(bin(int(a[0]))+bin(int(a[1]))+bin(int(a[2]))+bin(int(a[3])))
      s=s.replace("0b",".")
      m=re.search('\.[0,1]{1,8}\.[0,1]{1,8}\.[0,1]{1,8}\.[0,1]{1,8}$',s)
      if m is not None:
          print "Valid sequence of input"
      else :
          print "Invalid input sequence"
      

      为了简单起见,我使用了这种方法。 就像解释如何评估真正的 ipv4 地址一样简单。 尽管不需要检查其是否为二进制数。 希望你喜欢这个。

      【讨论】:

        【解决方案8】:
        str = "255.255.255.255"
        print(str.split('.'))
        
        list1 = str.split('.')
        
        condition=0
        
        if len(list1)==4:
            for i in list1:
                if int(i)>=0 and int(i)<=255:
                    condition=condition+1
        
        if condition!=4:
            print("Given number is not IP address")
        else:
            print("Given number is valid IP address")
        

        【讨论】:

          【解决方案9】:

          如果你真的想使用RegExs,下面的代码可能会过滤文件中的无效ip地址,无论文件的组织方式,每行一个或多个,即使有更多的文本(概念本身正则表达式):

          def getIps(filename):
              ips = []
              with open(filename) as file:
                  for line in file:
                      ipFound = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$").findall(line)
                      hasIncorrectBytes = False
                      try:
                              for ipAddr in ipFound:
                                  for byte in ipAddr:
                                      if int(byte) not in range(1, 255):
                                          hasIncorrectBytes = True
                                          break
                                      else:
                                          pass
                              if not hasIncorrectBytes:
                                  ips.append(ipAddr)
                      except:
                          hasIncorrectBytes = True
          
              return ips
          

          【讨论】:

            【解决方案10】:

            IP 地址使用以下身份验证:

            1. 255 ---> 250-255
            2. 249 ---> 200-249
            3. 199 ---> 100-199
            4. 99 ---> 10-99
            5. 9 ---> 1-9

              import re    
              k = 0
              while k < 5 : 
                  i = input("\nEnter Ip address : ")
                  ip = re.match("^([1][0-9][0-9].|^[2][5][0-5].|^[2][0-4][0-9].|^[1][0-9][0-9].|^[0-9][0-9].|^[0-9].)([1][0-9][0-9].|[2][5][0-5].|[2][0-4][0-9].|[1][0-9][0-9].|[0-9][0-9].|[0-9].)([1][0-9][0-9].|[2][5][0-5].|[2][0-4][0-9].|[1][0-9][0-9].|[0-9][0-9].|[0-9].)([1][0-9][0-9]|[2][5][0-5]|[2][0-4][0-9]|[1][0-9][0-9]|[0-9][0-9]|[0-9])$",i)
                  k = k + 1 
                  if ip:
                      print ("\n=====================")
                      print ("Valid IP address")
                      print ("=====================")
                      break
                  else :
                      print ("\nInvalid IP")
              else :
                  print ("\nAllowed Max 5 times")
              

            如有疑问请回复我?

            【讨论】:

              【解决方案11】:
              import re
              
              st1 = 'This is my IP Address10.123.56.25 789.356.441.561 127 255 123.55 192.168.1.2.3 192.168.2.2 str1'
              

              这里我的有效 IP 地址只有 192.168.2.2 并假设 10.123.56.25 不是一个有效的地址,因为它与一些字符串组合并且 192.168.1.2.3 无效。

              pat = r'\s(((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])\s|$))'
              
              match = re.search(pat,st1)
              
              print match.group()
              
              ================ RESTART: C:/Python27/Srujan/re_practice.py ================
              192.168.2.2 
              

              这将 grep 确切的 IP 地址,我们可以忽略任何看起来像 IP 地址但不是有效的模式。例如:'Address10.123.56.25', '789.356.441.561' '192.168.1.2.3'

              如果需要修改请评论。

              【讨论】:

                【解决方案12】:

                这适用于 python 2.7:

                import re
                a=raw_input("Enter a valid IP_Address:")
                b=("[0-9]+"+".")+"{3}"
                if re.match(b,a) and b<255:
                    print "Valid"
                else:
                    print "invalid"
                

                【讨论】:

                  【解决方案13】:

                  """ 正则表达式用于查找有效的 IP 地址 """

                  import re
                  
                  
                  IPV4 = re.fullmatch('([0-2][0-5]{2}|\d{2}|\d).([0-2][0-5]{2}|\d{2}|\d).([0-2][0-5]{2}|\d{2}|\d).([0-2][0-5]{2}|\d{2}|\d)', '100.1.1.2')
                  
                  if IPV4:
                      print ("Valid IP address")
                  
                  else:
                      print("Invalid IP address")
                  

                  【讨论】:

                  • 发帖前最好test
                  猜你喜欢
                  • 2012-07-03
                  • 2012-10-15
                  • 1970-01-01
                  • 2020-10-28
                  • 2012-06-26
                  • 2019-06-03
                  • 2011-02-11
                  • 2011-08-27
                  • 2022-03-03
                  相关资源
                  最近更新 更多