Форум сайта python.su
Есть небольшая задача , проверить корректность ввода маски подсети .
Ни как не могу понять как это реализовать , можете подсказать ?
Офлайн
Используй регулярное выражение.
Офлайн
py.user.nextТо есть я пишу 255.255.255.0 - всё ок
Используй регулярное выражение.
Офлайн
alexbestalexЧерез регулярное выражение ты проверяешь, что это вообще адрес (4 числа от 0 до 255), а потом в регулярном выражении у тебя есть группы, в которых и хранятся числа, ты их преобразываешь в целые и потом эти целые проверяешь на величину.
Это всё можно сделать с помощью модуля re ?
>>> import re >>> >>> def test_ipmask(s): ... pat = r'^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$' ... match = re.search(pat, s) ... if match is not None: ... a, b, c, d = map(int, match.groups()) ... if (0 <= a <= 255 and ... 0 <= b <= 255 and ... 0 <= c <= 255 and ... 0 <= d <= 255): ... return True ... return False ... >>> test_ipmask('123.123.123.123') True >>> test_ipmask('123.1234.123.123') False >>>
Офлайн
py.user.nextда вы шутите? где вы такие маски видели?
>>> test_ipmask('123.123.123.123')
True
1- й октет.
Если октет в (0,128,192,224,240,248,252,254) :
смотрим остальные октеты.
Если хотябы один из остальных октетов больше 0:
это не маска.
Иначе :
это маска .
ИначеЕсли в первом октете 255:
GOTO "1- й октет" но только для второго октета.
Иначе :
это не маска
[code python][/code]
Отредактировано PEHDOM (Апрель 8, 2017 17:22:18)
Офлайн
PEHDOM
если у тебя идет N единиц подряд, потом 32-N нулей или все нули или все единицы то это маска. Все остальное не маска.
…1- й октет.
Если октет в (0,128,192,224,240,248,252,254) :
смотрим остальные октеты.
Если хотябы один из остальных октетов больше 0:
это не маска.
Иначе :
это маска .
ИначеЕсли в первом октете 255:
GOTO "1- й октет" но только для второго октета.
Иначе :
это не маска
>>> import ipaddress >>> >>> ipaddress.IPv4Network('192.168.0.1/0.0.0.240') IPv4Network('192.168.0.1/32') >>> >>> bin(240) '0b11110000' >>>
Отредактировано py.user.next (Апрель 8, 2017 17:26:24)
Офлайн
py.user.nextэто обратная маска, или маска хоста.
192.168.0.1/0.0.0.240
[code python][/code]
Офлайн
PEHDOMПо твоему-то алгоритму получилось, что это не маска.
это обратная маска, или маска хоста.
Офлайн
py.user.nextтак это и не маска подсети, что тут непраивльно?
По твоему-то алгоритму получилось, что это не маска.
[code python][/code]
Отредактировано PEHDOM (Апрель 8, 2017 17:37:48)
Офлайн
PEHDOMНе видишь, что встроенный модуль пишет, что это маска?
так это и не маска подсети, что тут непраивльно?
>>> ipaddress.IPv4Network('192.168.0.1/0.0.0.238') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.3/ipaddress.py", line 1443, in __init__ % addr[1]) ipaddress.NetmaskValueError: '0.0.0.238' is not a valid netmask >>>
PEHDOMНу, это так устоялось просто исторически, но это не факт, что можно только так маски применять. Допустим, октет - да, он не может за пределами 0-255 значение иметь, а вот множество адресов вполне можно получить по любой маске. Просто исторически приняли, что она должна быть вот такой именно, так как сами сети определяются исторически определённым образом. Никогда не думал, почему выбрали именно 192.168? Почему выбрали именно эти числа? Ответа нет, просто исторически так сложилось.
это же азы
Отредактировано py.user.next (Апрель 8, 2017 17:50:15)
Офлайн