我需要从文本文件中解析有效且唯一的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中的最后一位数字在输出中被遗漏。有人可以帮我解决这个问题吗?
答案 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>