Найти - Пользователи
Полная версия: Регулярное выражение для поиска ip
Начало » Python для новичков » Регулярное выражение для поиска ip
1 2 3
Ardling
Долго думал над тем как заставить регулярные выражения искать ip адреса типа 192.164.0.1. Пока не придумал ничего лучше чем "({1,3}\.{1,3}\.{1,3}\.{1,3})". Но такое выражение пропускает явно не ip адреса типа 999.888.777.666. Это принципиальное ограничение регулярных выражений?
bazooka
это принцпиальное ограничение этого регулярного выражения
Ardling
bazooka
это принцпиальное ограничение этого регулярного выражения
А не могли бы вы предложить другое регулярное выражение, свободное от этого ограничения?
bazooka
неа, но в нете я видел такое
AlexKiriukha
В django для валидации IP используется такой регэксп:

ipv4_re = re.compile(r'^(25|2\d|?\d?\d)(\.(25|2\d|?\d?\d)){3}$')
pasaranax
Можно обойтись без регулярок
def isIp(ip):
for octet in ip.split("."):
if int(octet) not in range(256):
return False
return True

print isIp("192.168.1.1")
print isIp("10.0.0.256")
Можно еще добавить проверку на 0 в первом октете.
knkd
pasaranax
Можно обойтись без регулярок

Можно еще добавить проверку на 0 в первом октете.
И проверку на длину. А также на 127 и прочие :)
print(isIp("192.168.1.1.34.54.43.23"))
True
print(isIp("127.0.0.1"))
True
Ardling
pasaranax
Можно обойтись без регулярок
Нет нельзя, моя задача - выцепить из длинного текста айпишники.
AlexKiriukha
В django для валидации IP используется такой регэксп:
ipv4_re = re.compile(r'^(25|2\d|?\d?\d)(\.(25|2\d|?\d?\d)){3}$')
Спасибо. Пошел читать маны, многадумать и понимать смогу ли я это выражение адаптировать к своей задаче ).
Ardling
pasaranax
А правильно ли использовать конструкцию
if int(octet) not in range(256):
return False
вместо
int = int(octet)
return (int >= 0 and int <= 255)
knkd
Ardling
Нет нельзя, моя задача - выцепить из длинного текста айпишники.
Можно.
Сначала простой регуляркой вылавливаем из текста всё что хоть издали напоминает айпишники, а потом фильтруем их.
Быстродействие и безошибочность регулярного выражения обратно пропорциональна его сложности.

Както так?
def is_ip(ip):
res = True
octets = ip.split(".")
for octet in octets:
if (255 < int(octet) or (int(octet) < 0) or (len(octets) != 4):
res = False
break
return res
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB