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