Регулярное выражение Python для сопоставления IP-адреса с / CIDR - PullRequest
4 голосов
/ 19 ноября 2010
m = re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",s)

Как мне изменить его, чтобы он соответствовал не только IPv4, но и чему-то с CIDR, например 10.10.10.0/24?

Ответы [ 8 ]

3 голосов
/ 19 ноября 2010

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

1 голос
/ 21 декабря 2011

У меня были проблемы с использованием регулярного выражения, похожего на ваше.Это соответствовало 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

1 голос
/ 14 апреля 2011

\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 голос
/ 19 ноября 2010
0 голосов
/ 25 мая 2019

Только что сделал действительно хорошее регулярное выражение, которое также проверяет правильность формата ip, не слишком длинное и, возможно, соответствует длине подсети:

(25[0-5]|2[0-4]\d|1\d\d|\d\d|\d).(?1).(?1).(?1)\/?(\d\d)?
0 голосов
/ 02 июня 2012

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

0 голосов
/ 19 ноября 2010

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

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\\\d{1,2}
0 голосов
/ 19 ноября 2010

Добавить "(?:/\d{1,2})?".

Это дает вам r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2})?" за образец.

...