Ardling
Фев. 28, 2010 10:29:36
Долго думал над тем как заставить регулярные выражения искать ip адреса типа 192.164.0.1. Пока не придумал ничего лучше чем "({1,3}\.{1,3}\.{1,3}\.{1,3})". Но такое выражение пропускает явно не ip адреса типа 999.888.777.666. Это принципиальное ограничение регулярных выражений?
bazooka
Фев. 28, 2010 10:33:42
это принцпиальное ограничение этого регулярного выражения
Ardling
Фев. 28, 2010 10:38:05
bazooka
это принцпиальное ограничение этого регулярного выражения
А не могли бы вы предложить другое регулярное выражение, свободное от этого ограничения?
bazooka
Фев. 28, 2010 11:11:50
неа, но в нете я видел такое
AlexKiriukha
Фев. 28, 2010 12:21:49
В django для валидации IP используется такой регэксп:
ipv4_re = re.compile(r'^(25|2\d|?\d?\d)(\.(25|2\d|?\d?\d)){3}$')
pasaranax
Фев. 28, 2010 12:44:48
Можно обойтись без регулярок
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
Фев. 28, 2010 13:03:58
pasaranax
Можно обойтись без регулярок
…
Можно еще добавить проверку на 0 в первом октете.
И проверку на длину. А также на 127 и прочие :)
print(isIp("192.168.1.1.34.54.43.23"))
True
print(isIp("127.0.0.1"))
True
Ardling
Фев. 28, 2010 14:11:45
pasaranax
Можно обойтись без регулярок
Нет нельзя, моя задача - выцепить из длинного текста айпишники.
AlexKiriukha
В django для валидации IP используется такой регэксп:
ipv4_re = re.compile(r'^(25|2\d|?\d?\d)(\.(25|2\d|?\d?\d)){3}$')
Спасибо. Пошел читать маны, многадумать и понимать смогу ли я это выражение адаптировать к своей задаче ).
Ardling
Фев. 28, 2010 14:18:49
pasaranaxА правильно ли использовать конструкцию
if int(octet) not in range(256):
return False
вместо
int = int(octet)
return (int >= 0 and int <= 255)
knkd
Фев. 28, 2010 14:44:55
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