从html字符串中提取IP地址(python)

时间:2010-05-23 06:57:25

标签: python regex string

我的朋友们,

我真的想用Python从字符串中提取一个简单的IP地址(实际上是一行的html)。但事实证明,2小时过去了,我仍然无法找到一个好的解决方案。

>>> 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有一个牢固的把握,上面的代码是从网上的其他地方找到并修改过的。

寻求您的意见和建议!

6 个答案:

答案 0 :(得分:49)

删除您的捕获组:

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

结果:

['165.91.15.131']

注意:

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

答案 1 :(得分: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']

答案 2 :(得分: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']

答案 3 :(得分:2)

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

>>>-1%10  
9
  

在[42]中:info

     

Out [42]:[&#39; 165.91.15.131&#39;]

答案 4 :(得分:2)

您可以使用以下正则表达式来提取有效的IP而不会出现错误 1.有些检测到123.456.789.111为有效的IP
2.有些人没有将127.0.00.1视为有效的知识产权 3.有些人不会像08.8.8.8

那样检测到以零开头的IP

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

  

注意:我已经提取了超过2百万个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)

答案 5 :(得分:1)

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

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返回到字符串或None

如果您希望更准确的解析或更改Web服务提供商,则可以将address_regexp替换为其他正则表达式。