import re

# Путь файла для обработки
LogFilePath = 'access.log'
# Регулярное выражение для IP адреса
# Добавлено в конце " - -", так как после IP адреса всегда идёт эта комбинация
# (без этой добавки находятся строки, которые имеют формат IP адреса, но не являются ими)
IPregular1 = re.compile('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} - -')
# Регулярное выражение для /24 подсети
IPregular2 = re.compile('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.')

# Считываем текст файла
LogFile = open(LogFilePath)
LogFileText = LogFile.read()
# Ищем в полученном тексте все IP адреса
IPAll = IPregular1.findall(LogFileText)

# Создаём список уникальных /24 подсетей и IP адресов
IPNetList = []
IPList = []
IPCount = 0

# Рассматриваем поочерёдно все IP адреса
for i in IPAll :
    # При этом отсекаем последние 4 символа " - -", так как они больше не нужны
    IP = i[:-4]
    # /24 подсеть
    IPNet = (IPregular2.findall(IP))[0]
    # Если /24 подсеть ещё не запомнена в качестве уникальной, то добавляем в список
    if IPNet not in IPNetList :
        IPNetList.append(IPNet)
        # Также добавляем пустой список, в который для найденной подсети будем добавлять IP адреса
        IPList.append([])
    # Ищем позицию рассматриваемой подсети IPNet в списке уникальных подсетей
    IPNetIndex = IPNetList.index(IPNet)
    # Если IP адрес ещё не запомнен в качестве уникального, то добавляем в список для соответствующей подсети
    if IP not in IPList[IPNetIndex] :
        IPList[IPNetIndex].append(IP)
        IPCount += 1

# Вывод информации об общем количестве IP адресов, количестве уникальных IP адресов, количестве /24 подсетей
print("--------------------------------------------------")
print("IP all:\t\t", len(IPAll))
print("IP uniqe:\t", IPCount)
print("IP /24 subnets:\t", len(IPList))
print("--------------------------------------------------")
# Вывод списка IP адресов, сгруппированных по /24 подсетям
print("IP list:")
for i in IPList :
    print(i)
