m = re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",s)
Как изменить его так, это будет соответствовать не только IPv4, но и что-то с CIDR как 10.10.10.0/24
?питон регулярное выражение CIDR соответствие
m = re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",s)
Как изменить его так, это будет соответствовать не только IPv4, но и что-то с CIDR как 10.10.10.0/24
?питон регулярное выражение CIDR соответствие
Append "(?:/\d{1,2})?"
.
Для этого вам понадобится r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2})?"
.
это расширяет существующий выражение
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\\\d{1,2}
(?:\d{1,3}\.){3}\d{1,3}(?:/\d\d?)?
Эта страница, кажется, есть решение http://hse-at-work.blogspot.com/2006/11/regular-expression-to-match-ipv4.html
\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.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
Существует а all_matching_cidrs (IP, cidrs) функция в ф netaddr в модуль получает ip и сопоставляет его со списком адресов CIDR.
400.123.34.56 сопоставлен, но недействителен (но имеет значение проблема с регулярным выражением asdasdasd) – Tim
Просто FYI, возможно, потребуется экранировать '/' на таких языках, как Javascript. – Dave