【问题标题】:How to extract an IP address from an HTML string?如何从 HTML 字符串中提取 IP 地址?
【发布时间】:2011-02-22 20:52:57
【问题描述】:

我想使用 Python 从字符串(实际上是单行 HTML)中提取 IP 地址。

>>> s = "<html><head><title>Current IP Check</title></head><body>Current IP Address: 165.91.15.131</body></html>"

-- '165.91.15.131' 是我想要的!

我尝试使用正则表达式,但到目前为止我只能得到第一个数字。

>>> import re
>>> ip = re.findall( r'([0-9]+)(?:\.[0-9]+){3}', s )
>>> ip
['165']

但我对 reg-expression 没有牢牢把握;上面的代码是从网络上的其他地方找到并修改的。

【问题讨论】:

标签: python regex string


【解决方案1】:

您可以使用以下正则表达式提取有效 IP 而不会出现以下错误
1.部分检测到123.456.789.111为有效IP
2.有些没有将127.0.00.1检测为有效IP
3.有些不检测以零开头的IP,如08.8.8.8

所以我在这里发布了一个适用于上述所有条件的正则表达式。

注意:我已经提取了超过 200 万个 IP,使用以下正则表达式没有任何问题。

(?:(?:1\d\d|2[0-5][0-5]|2[0-4]\d|0?[1-9]\d|0?0?\d)\.){3}(?:1\d\d|2[0-5][0-5]|2[0-4]\d|0?[1-9]\d|0?0?\d)

【讨论】:

  • 你能详细说明你的regex pattern吗??
  • @MohammadZainAbbas。我想这将是一个很长的答复。随意享受这个互动解释 -> regexr.com/4r3j3
【解决方案2】:

从日志中找到IP地址的最简单方法..

 s = "<html><head><title>Current IP Check</title></head><body>Current IP Address: 165.91.15.131</body></html>"
 info = re.findall(r'[\d.-]+', s)

在 [42] 中:信息

输出[42]:['165.91.15.131']

【讨论】:

  • 你能解释一下这个 [\d.-]+ , '- after .它将代表什么
  • [\d.-]+ 将抓取任何数字,即使字符串不包含 IP,即:它将抓取 IP 和数字 1 & 2 在类似 104.108.71.62: has versionsr: 1 vs. 2 的句子中/跨度>
【解决方案3】:

我就是这样做的。我觉得很干净

import re
import urllib2

def getIP():
    ip_checker_url = "http://checkip.dyndns.org/"
    address_regexp = re.compile ('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
    response = urllib2.urlopen(ip_checker_url).read()
    result = address_regexp.search(response)

    if result:
            return result.group()
    else:
            return None

get_IP() 将 ip 返回为字符串或无

如果您喜欢更准确的解析或更改网络服务提供商,您可以用 address_regexp 替换其他正则表达式。

【讨论】:

    【解决方案4】:
    import re
    
    ipPattern = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
    
    findIP = re.findall(ipPattern,s)
    
    findIP contains ['165.91.15.131']
    

    【讨论】:

      【解决方案5】:

      删除您的捕获组:

      ip = re.findall( r'[0-9]+(?:\.[0-9]+){3}', s )
      

      结果:

      ['165.91.15.131']
      

      注意事项:

      • 如果您正在解析 HTML,最好查看BeautifulSoup
      • 您的正则表达式匹配一些无效的 IP 地址,例如 0.00.999.9999。这不一定是问题,但您应该意识到它并可能处理这种情况。您可以将 + 更改为 {1,3} 以进行部分修复,而不会使正则表达式过于复杂。

      【讨论】:

      • 您可以使用正则表达式仅接受有效的 IP 地址 "\\b(?:(?: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]?)\\b"
      • 非常好。对于那些对 (?:...) 的影响感兴趣的人,您可以在文档docs.python.org/2/library/re.html 中找到它:“(?:...) 正则括号的非捕获版本。匹配任何正则表达式在括号内,但组匹配的子字符串在执行匹配后无法检索或稍后在模式中引用。"
      • @o0rebelious0o 令人印象深刻的正则表达式。为方便起见,如果您已经在使用这个 python 解决方案,您可以使用ipaddress.ip_address(ip) 来检查它。
      【解决方案6】:

      您可以使用以下正则表达式仅捕获有效的 IP 地址

      re.findall(r'\b25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\b',s)
      

      返回

      ['165', '91', '15', '131']
      

      【讨论】:

      • 从技术上讲,这不匹配有效的 IP 地址,而是有效的八位字节。它们可以有任意数量,可能需要在单独的步骤中进行检查。
      猜你喜欢
      • 2013-05-25
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 2019-08-09
      • 1970-01-01
      相关资源
      最近更新 更多