Как отсортировать список списков с IP-подсетями Python - PullRequest
0 голосов
/ 18 марта 2019

Я полный нуб, и Google сделал мой первый скрипт на Python.

Я открываю 2 файла и удаляю список 1 из списка 2.

После изменения списка 2 для удаления того, что было в списке 1, я хочу отсортировать список по IP-сети.например:

1.1.1.1/24
1.1.1.1/32
5.5.5.5/20
10.10.11.12/26
10.11.10.4/32

в настоящее время сортировка

1.1.1.1/24
1.1.1.1/32
10.10.11.12/26
10.11.10.4/32
5.5.5.5/20

код:

import os
import sys
import random
import re

text_file = open("D:/file/update2.txt", "rt")
lines = str(text_file.readlines())
text_file.close()
ip_address = r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d] 
{1,3}/\d{1,2})'
foundip = re.findall( ip_address, lines )


text_file2 = open("D:/file/Block.txt", "rt")
lines2 = str(text_file2.readlines())
text_file2.close()
foundip2 = re.findall( ip_address, lines2 )


test =(list(set(foundip2) - set(foundip)))

items = sorted(test)
print (*items, sep = "\n")

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

сортировка по умолчанию - алфавитно-цифровая сортировка.Вам нужно создать целочисленные кортежи из ваших IP-адресов, чтобы использовать их в качестве функции ключа сортировки.Я использую re.findall с выражением «цифры», затем преобразую в int (но есть и другие решения, например, split)

import re

ip_list = """1.1.1.1/24
1.1.1.1/32
10.10.11.12/26
10.11.10.4/32
5.5.5.5/20""".splitlines()

print(sorted(ip_list,key=lambda x : [int(m) for m in re.findall("\d+",x)]))

печатает:

['1.1.1.1/24', '1.1.1.1/32', '5.5.5.5/20', '10.10.11.12/26', '10.11.10.4/32']
1 голос
/ 18 марта 2019

Ваша проблема проистекает из того факта, что алфавитная сортировка делает не то, что вы хотите (найти 10.x «меньше», чем 5.x). Поэтому вам нужно передать функцию, которая преобразует строку IP-адреса в числа, чтобы эта функция следовала вашей интуиции о том, что должно произойти первым.

Решение: Сначала я создам тип для IP, где я буду анализировать строку на 4 группы и порт и сравнивать их на основе этих кортежей (см. Сортировку кортежей python).

from collections import namedtuple
ip_type = namedtuple("IP", 'g1 g2 g3 g4 port')

def to_ip(string: str) -> ip_type:
    groups, port = string.split('/')
    g1, g2, g3, g4 = [int(g) for g in groups.split('.')]
    return ip_type(g1, g2, g3, g4, int(port) )


array = [   '1.1.1.1/24',
            '1.1.1.1/32',
            '10.10.11.12/26',
            '10.11.10.4/32',
            '5.5.5.5/20'    ]

print(sorted(array, key=to_ip))
...