我目前用Python编写的脚本应该从文本文档中抓取两个IP,找到IPS之间的范围,然后将输出写入新文件。我得到了脚本输出我想要的东西,但问题是它打印相同的IP两次,这不会像我想的那样有效。我认为问题出在我的第一个正则表达式上,但我愿意接受任何建议。
import re
def ipRange(start_ip, end_ip):
start = list(map(int, start_ip.split(".")))
end = list(map(int, end_ip.split(".")))
temp = start
ip_range = []
ip_range.append(start_ip)
while temp != end:
start[3] += 1
for i in (3,2):
if temp[i] == 256:
temp[i] = 0
temp[i-1] += 1
ip_range.append(".".join(map(str, temp)))
return ip_range
with open(r'AU Sorted IPs') as f:
fstring = f.readlines()
newFile = open("AU IP Block.txt", "w")
start_ip = re.compile(r'(d{1,3}.d{1,3}.d{1,3}.d{1})')
end_ip = re.compile(r'(d{1,3}.d{1,3}.d{1,3}.d{3})')
for line in fstring:
ip_range = ipRange(start_ip.search(line).group(), end_ip.search(line).group())
for ip in ip_range:
newFile.write((ip)+"n")
print(ip)
newFile.close()
输出文件如下:
1.1.1.11.1.1.11.1.1.21.1.1.21.1.1.31.1.1.31.1.1.41.1.1.4等。我不希望输出重复。
可以将ip_range
的类型从list更改为set;后者不允许重复条目:
def ipRange(start_ip, end_ip):
start = list(map(int, start_ip.split(".")))
end = list(map(int, end_ip.split(".")))
temp = start
ip_range = set()
ip_range.add(start_ip)
while temp != end:
start[3] += 1
for i in (3,2):
if temp[i] == 256:
temp[i] = 0
temp[i-1] += 1
ip_range.add(".".join(map(str, temp)))
return ip_range
在这种情况下,输出应该是一个具有唯一条目的集合(在这种情况下是ip(s))