从文件中提取有效且唯一的IP地址

时间:2016-11-22 07:06:34

标签: python regex python-2.7 ipython

我需要从文本文件中解析有效且唯一的IP地址。

要解析的示例文件:

ping working 3.3.3.3
ping not working 8.8.8.888
ping working 5.5.55.6 ip address
I am repeat 3.3.3.3
invalid 0.0.0.266
I am not repeat 8.88.8.255
I am 255.255.255.0
I am 111.111.111.111
I am not valid 355.355.355.355
I am valid 192.168.99.1

代码:

import re
pattern = r"((([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])[ (\[]?(\.|dot)[ )\]]?){3}([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]))"

f = open("parse-me.txt","r")
text = f.read()

ips = [match[0] for match in re.findall(pattern, text)]
print list(set(ips))

当我运行它时,它提供以下输出:

python parse_ip.py
['111.111.111.111', '255.255.255.0', '192.168.99.1', '3.3.3.3', '0.0.0.26', '8.88.8.25', '5.5.55.6', '8.8.8.88']

不知何故,255中的最后一位数字在输出中被遗漏。有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

如果您使用以下正则表达式,您的问题将得到解决:

    pattern = r"(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])[ (\[]?(\.|dot)[ )\]]?){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9]))"

你可以看到我刚重新安排了你的正则表达式。实际上在“|”条件如果第一个条件成立,它将不会进行第二个条件匹配。

但是小心这个正则表达式仍然会给出错误的结果,因为它将8.8.88.888解析为8.8.88.88

我想回答你的疑问,但你需要新的正则表达式

答案 1 :(得分:0)

依靠Python自己的IP地址验证可能更有意义,如下所示:

import socket
import re

valid = set()

with open('input.txt') as f_input:
    for ip in re.findall(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', f_input.read()):
        try:
            socket.inet_aton(ip)
            valid.add(ip)
        except socket.error:
            pass

print list(valid)

这会显示

['111.111.111.111', '255.255.255.0', '8.88.8.255', '192.168.99.1', '3.3.3.3', '5.5.55.6']

答案 2 :(得分:-1)

希望这会有所帮助

 <Border BorderBrush="color" BorderThickness="0" >
      <Border.Effect>
         <DropShadowEffect BlurRadius="10" Color="black" Direction="235" Opacity=".3" RenderingBias="Performance"  ShadowDepth="4" />
      </Border.Effect>
 </Border>