Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 28, 2010 10:29:36

Ardling
От:
Зарегистрирован: 2009-05-01
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярное выражение для поиска ip

Долго думал над тем как заставить регулярные выражения искать ip адреса типа 192.164.0.1. Пока не придумал ничего лучше чем "({1,3}\.{1,3}\.{1,3}\.{1,3})". Но такое выражение пропускает явно не ip адреса типа 999.888.777.666. Это принципиальное ограничение регулярных выражений?



Офлайн

#2 Фев. 28, 2010 10:33:42

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярное выражение для поиска ip

это принцпиальное ограничение этого регулярного выражения



Офлайн

#3 Фев. 28, 2010 10:38:05

Ardling
От:
Зарегистрирован: 2009-05-01
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярное выражение для поиска ip

bazooka
это принцпиальное ограничение этого регулярного выражения
А не могли бы вы предложить другое регулярное выражение, свободное от этого ограничения?



Офлайн

#4 Фев. 28, 2010 11:11:50

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярное выражение для поиска ip

неа, но в нете я видел такое



Офлайн

#5 Фев. 28, 2010 12:21:49

AlexKiriukha
От:
Зарегистрирован: 2008-02-03
Сообщения: 81
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярное выражение для поиска ip

В django для валидации IP используется такой регэксп:

ipv4_re = re.compile(r'^(25|2\d|?\d?\d)(\.(25|2\d|?\d?\d)){3}$')



Офлайн

#6 Фев. 28, 2010 12:44:48

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярное выражение для поиска ip

Можно обойтись без регулярок

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 в первом октете.



Офлайн

#7 Фев. 28, 2010 13:03:58

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярное выражение для поиска ip

pasaranax
Можно обойтись без регулярок

Можно еще добавить проверку на 0 в первом октете.
И проверку на длину. А также на 127 и прочие :)
print(isIp("192.168.1.1.34.54.43.23"))
True
print(isIp("127.0.0.1"))
True



Офлайн

#8 Фев. 28, 2010 14:11:45

Ardling
От:
Зарегистрирован: 2009-05-01
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярное выражение для поиска ip

pasaranax
Можно обойтись без регулярок
Нет нельзя, моя задача - выцепить из длинного текста айпишники.
AlexKiriukha
В django для валидации IP используется такой регэксп:
ipv4_re = re.compile(r'^(25|2\d|?\d?\d)(\.(25|2\d|?\d?\d)){3}$')
Спасибо. Пошел читать маны, многадумать и понимать смогу ли я это выражение адаптировать к своей задаче ).



Офлайн

#9 Фев. 28, 2010 14:18:49

Ardling
От:
Зарегистрирован: 2009-05-01
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярное выражение для поиска ip

pasaranax
А правильно ли использовать конструкцию

if int(octet) not in range(256):
return False
вместо
int = int(octet)
return (int >= 0 and int <= 255)



Отредактировано (Фев. 28, 2010 14:19:37)

Офлайн

#10 Фев. 28, 2010 14:44:55

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярное выражение для поиска ip

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



Отредактировано (Фев. 28, 2010 15:09:38)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version