Вы также можете сделать это более кратко, используя Reduce (из functools):
from functools import reduce
def expandIp(ip):
nodes = [list(map(int,n.split(":"))) for n in ip.split(".")]
ranges = [range(max(n[0],0),min(n[-1]+1,256)) for n in nodes]
ips = reduce(lambda a,rng: [ip+[n] for ip in a for n in rng],ranges,[[]])
return [".".join(str(n) for n in ip) for ip in ips]
nodes
преобразует шаблон ip в список значений диапазона [start] или [start, end]
ranges
преобразует узлы в фактические диапазоны, используя начальный номер в качестве конца, когда для узла нет спецификатора ':' (также ограничивает узел диапазоном 0 ... 255)
ips
объединяет каждый диапазон узлов со всеми значениями предыдущих узлов
- Результатом является объединение узлов в каждой комбинации с "." в качестве разделителя
примечание: это решение будет работать для нескольких спецификаторов диапазона в параметре ip. например expandIp("10.1.1:2.100:101")
будет производить: 10.1.1.100, 10.1.1.101, 10.1.2.100, 10.1.2.101. Так что если вы собираетесь использовать его для подсетей, вы сможете сделать expandIp("10.0.1:3.0:255")
Кстати, вы можете проверить параметр ip
с помощью одного условия в начале функции или перед ее вызовом (тогда вам не нужно будет использовать min / max для присвоения переменной ranges
):
n0255 = { str(n) for n in range(256) }
if not all( i<4 and j<2 and r in n0255 for i,n in enumerate(ip.split(".")) for j,r in enumerate(n.split(":"))):
print("Invalid Input")
Последняя функция будет выглядеть так:
from functools import reduce
n0255 = { str(n) for n in range(256) }
def expandIp(ip):
if not all( i<4 and j<2 and r in n0255 for i,n in enumerate(ip.split(".")) for j,r in enumerate(n.split(":"))):
return None
nodes = [list(map(int,n.split(":"))) for n in ip.split(".")]
ranges = [range(n[0],n[-1]+1) for n in nodes]
ips = reduce(lambda a,rng: [ip+[n] for ip in a for n in rng],ranges,[[]])
return [".".join(str(n) for n in ip) for ip in ips]
, что упростит ваш код вызова до:
collected_ips = []
while True:
query = input("IP:\t")
if not query:
break
ips = expandIp(query)
if not ips:
print("Invalid Input")
else:
collected_ips += ips