2016-10-14 6 views
0

Проблема заключается в том, что я в основном хотел бы найти, есть ли свободные подсети между агрегированным адресом BGP (например: 10.76.32.0 255.255.240.0) и всеми сетевыми командами на тот же маршрутизатор (например, 10.76.32.0 255.255.255.0, 10.76.33.0 255.255.255.0)python - вычитание диапазонов от больших диапазонов

В приведенном выше примере 10.76.34.0 -> 10.76.47.255 будет бесплатным.

Я собираюсь решить эту проблему, преобразовывая IP-адреса и маски подсети в двоичные и вычитая этот путь.

Чтобы это было просто, я сохраню этот пример в десятичной форме, но это может оставить меня со следующей проблемой: допустим, у меня диапазон от 1 до 250, я вычитаю из этого меньший диапазон, который идет от 20 до 23 , Я хотел бы получить диапазон от 1 до 19 и от 24 до 250.

Использование команды range не дает мне ожидаемых результатов, и хотя я мог бы создать список с каждым элементом в диапазоне и вычитать другой список с подмножеством элементов, мне кажется, что неплохо было бы иметь списки с, возможно, десятками тысяч элементов.

Hunor

+1

Пробовали ли вы IPAddress - Библиотека манипуляций IPv4/IPv6? У этого есть много интересных особенностей. https://docs.python.org/3/library/ipaddress.html –

+0

Я согласен с Pancho, я бы использовал ip-адрес lib, поскольку я не вижу, чтобы ваша логика диапазона была очень надежной. Также как вы получаете '10.76.34.0 -> 10.79.47.255'? Последний адрес в '10.76.32.0/20' был бы' 10.76.47.254' –

+0

@Panch Jay Я сделал, и я просто хотел сказать, что я не нашел ни одного из его методов, чтобы помочь с моей проблемой, но пошел проверять другой время, чтобы убедиться ... и я нашел 'address_exclude (network)', который делает то, что я пытался выполнить. Спасибо за Ваш ответ. К сожалению, я не думаю, что я могу отметить два ответа как правильно, а elethan ответил первым :( –

ответ

1

Если вы пытаетесь создать «диапазон» с зазором в нем, то есть с 1-9 и 24-250, вы можете попробовать использовать filterfalse (или ifilterfalse, если вы используете Python 2.X) из модуля itertools, который принимает в качестве своих аргументов предикат и последовательность и возвращает элементы последовательности, в которых предикат возвращает False. В качестве примера, если вы:

from itertools import filterfalse 
new_range = filterfalse(lambda x: 20 <= x <= 23, range(1,251)) 

new_range будет итератор, содержащий номера 1-19 и 24-250, которые могут быть использованы аналогично range():

for i in new_range: 
    do_things() 
+0

Это похоже на то, что я искал. Я сделал несколько тестов с его помощью: - Вы можете повторно использовать итерируемый объект, чтобы вычесть другой диапазон из него точно так же. - Он не бросает никаких ошибок, если вы вычитаете элементы, которые не являются частью объекта, он просто вычитает, что находится в границах и игнорирует остальные. Спасибо: D –

+0

Рад это слышать! itertools имеет много действительно полезных и иногда неожиданных функций. Если у вас есть проблема с итераторами, часто стоит проверить. – elethan