2010-11-19 5 views

ответ

0

Append "(?:/\d{1,2})?".

Для этого вам понадобится r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2})?".

0

это расширяет существующий выражение

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\\\d{1,2} 
3

(?:\d{1,3}\.){3}\d{1,3}(?:/\d\d?)?

+0

400.123.34.56 сопоставлен, но недействителен (но имеет значение проблема с регулярным выражением asdasdasd) – Tim

+1

Просто FYI, возможно, потребуется экранировать '/' на таких языках, как Javascript. – Dave

1

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2}|)

Expresso Испытано в

Соответствует:

64.33.232.212 
64.33.232.212/30 
1

У меня были проблемы с использованием регулярного выражения, подобного вашему. Это соответствовало 1.2.3.4.5 (как 1.2.3.4) и 1111.2.3.4 (как 111.2.3.4). Для того, чтобы избежать сопоставления их, я добавил смотреть вперед/за утверждений:

IP_RE  = re.compile(r"(?<!\d\.)(?<!\d)(?:\d{1,3}\.){3}\d{1,3}(?!\d|(?:\.\d))") 
IP_CIDR_RE = re.compile(r"(?<!\d\.)(?<!\d)(?:\d{1,3}\.){3}\d{1,3}/\d{1,2}(?!\d|(?:\.\d))") 

В (?<!\d\.)(?<!\d) проверяет, что не является числом или октет до первого октета (т.е. не 1 до того 111.2.3.4). И (?!\d|(?:\.\d)) проверяет, нет ли числа/октета после последнего (т.е.: нет .5 после 1.2.3.4).

Затем, чтобы проверить, что строки эти совпадения являются действительными IP-адреса (например: не 277.1.1.1), вы можете использовать

socket.inet_aton(ip) #raises exception if IP is invalid

0

Существует а all_matching_cidrs (IP, cidrs) функция в ф netaddr в модуль получает ip и сопоставляет его со списком адресов CIDR.

Смежные вопросы