Удалить начальные нули в IP-адресе с помощью Python

Удалите ненужные нули в IP-адресе:

100.020.003.400  ->  100.20.3.400
001.200.000.004  ->  1.200.0.4
000.002.300.000  ->  0.2.300.0   (optional silly test)

Моя попытка работает не во всех случаях:

import re
ip = re.sub('[.]0+', '.', ip_with_zeroes)

Есть аналогичный вопрос, но для других языков:

Пожалуйста, предоставьте решения для Python v2 и v3.


person oHo    schedule 30.06.2017    source источник
comment
clean_ip = ..join([str(int(x)) для x в ip.split(.)])   -  person havanagrawal    schedule 30.06.2017


Ответы (6)


Используйте библиотеку netaddr с флагом ZEROFILL:

import netaddr

ip = "055.023.156.008"

no_zero_ip = netaddr.IPAddress(ip, flags=netaddr.ZEROFILL).ipv4()

# IPAddress('55.23.156.8')

Вы, вероятно, захотите изменить результат no_zero_ip на строку или что-то еще, если вам не нужен тип IPAddress

person Irena Damsky    schedule 15.01.2018

До версии 2.6 вы можете использовать оператор строки по модулю. Но не будем об этом.

Это должно делать это еще тогда, когда был введен метод format (2.6 ):

'.'.join('{0}'.format(int(i)) for i in ip.split('.'))

При желании удалите индекс для python ≥3,3 или ≥2,7 (я думаю):

'.'.join('{}'.format(int(i)) for i in ip.split('.'))

И только для python ≥3.6 мы получаем f-string:

'.'.join(f'{int(i)}' for i in ip.split('.'))

Если вы можете использовать последний, я настоятельно рекомендую его. Это вполне удовлетворительно.

person Rick supports Monica    schedule 30.06.2017
comment
Хороший! Это работает для меня на Python 3.6 и Python 3.5. Однако не уверен насчет Python 2. - person Christian Dean; 30.06.2017
comment
@ChristianDean Должен работать как минимум в 2.7. Не уверен в других. - person Rick supports Monica; 30.06.2017
comment
ОК, фантомный даунвотер. Есть шанс, что ты хочешь объясниться? - person Rick supports Monica; 01.07.2017

Используйте группу захвата, чтобы сопоставить последнюю цифру и скопировать ее, чтобы предотвратить замену всех цифр.

ip = re.sub(r'\b0+(\d)', r'\1', ip_with_zeroes)
person Barmar    schedule 30.06.2017

Вы можете разделить на "." преобразовать в целое число, а затем в строку и соединить с помощью "."

ip = ".".join([str(int(i)) for i in ip.split(".")])
person noviceprogrammer    schedule 30.06.2017

Самый простой способ сделать это на Python 3.3+ — использовать встроенный модуль ipaddress.

import ipaddress
print(str(ipaddress.ip_address("127.000.000.1")))

будет печатать

127.0.0.1

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

person ismail    schedule 07.12.2018
comment
Спасибо за предложение ipaddress, как это сделал Реут Шарабани в 2017 году, но ipaddress не может удалить ведущие нули из "010.10.10.10". Приподнятое ValueError: u'010.10.10.10' does not appear to be an IPv4 or IPv6 address вызывает удивление, потому что "10.10.10.10" является действительным адресом IPv4. Поэтому модуль ipaddress не является хорошим вариантом :-( К вашему сведению, ipaddress также может использоваться Python 2.7, но входная строка должна быть u"10.10.10.10". - person oHo; 28.12.2018

person    schedule
comment
просто примечание, квадратные скобки лишние - person Alter; 30.06.2017
comment
@Alter Не обязательно. ''.join() создает список из переданного итерируемого объекта в любом случае, так что это, вероятно, улучшит скорость передачи списка заранее. - person Christian Dean; 30.06.2017
comment
интересно! Я пытаюсь проверить это сейчас. Я просмотрел PySequence_Fast и не могу найти ничего, что явно говорило бы о том, что он делает списки быстрее, но это может быть правдой. - person Alter; 30.06.2017
comment
с 10 ** 6 автоматически сгенерированными IP-адресами метод списка занимает ~ 11,2 секунды, а генератор занимает ~ 11,5 секунды в среднем по нескольким запускам. Так чуть быстрее. edit Я учел время на генерацию ips, без него оно более выражено от 3,2 до 2,8 с. - person Alter; 30.06.2017