Регулярное выражение для поиска по IP-адресу - PullRequest
0 голосов
/ 26 октября 2019

Мне нужна ваша помощь с заданным выражением регулярного выражения для получения IP-адреса из имен DNS

Я написал небольшой скрипт:

#!/usr/bin/env python

import re

domains = [
    "us-west-2.elasticmapreduce.amazonaws.com",
    "ip-10-27-87-173",
    "ip-10-27-91-145.us-west-2.compute.internal",
    "ip-10-27-90-170.us-west-2.compute.internal.us-west-2.compute.internal",
    "ec2-54-82-117-121",
    "ec2-54-82-117-121.compute-1.amazonaws.com",
    "ec2-54-82-117-121.compute-1.amazonaws.com.us-west-2.compute.internal",
    "ip-10-27-102-175.us-west-2.compute.internal.us-west-2.compute.internal",
    "ip-10-27-180-213.us-west-2.compute.internal",
    "ip-10-27-107-136.us-west-2.compute.internal.us-west-2.compute.internal",
    "ip-10-27-209-104.us-east-1.compute.internal",
    "ip-10-27-209-104.us-east-1.compute.internal.us-east-1.compute.internal",
    "ip-10-27-209-104.us-east-1.compute.internal.ec2.internal",
    "ip-10-27-112-164.ec2.internal"
]

regexp1 = "(ip|ec2)-((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\-){3}(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)))($|(?:ec2|[^.]+\.compute)\.internal\.$)?"


print("REGEXP: {0}".format(regexp1))
for domain in domains:
    result = re.match(regexp1, domain)
    if result:
        print("{0:>8} domain: {1:<90} matched with regexp, groups: {2:>30}".format("TRUE", domain, result.groups()))
    else:
        print("{0:>8} domain: {1:<90} not matched with regexp".format("FALSE", domain))

, но результат этого скрипта:

   FALSE domain: ip-10-27-209-104.us-east-1.compute.internal                                                not matched with regexp
   FALSE domain: ip-10-27-209-104.us-east-1.compute.internal.us-east-1.compute.internal                     not matched with regexp
   FALSE domain: ip-10-27-209-104.us-east-1.compute.internal.ec2.internal                                   not matched with regexp

выглядит не очень хорошо, я обнаружил, что результат не так хорош для меня:

проблема в строке:

ip-10-27-209-104.us-east-1.compute.internal

, если я заменил 209 на значение меньше 200, и все работалоЧто ж. Что-то не так с моим выражением регулярного выражения

Не могли бы вы помочь найти причину этого поведения и оптимизировать выражение Идея выбрать IP-адрес из имени DNS.

Спасибо

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Проблема с вашим кодом заключается в чередовании, у вас есть -, включенное в последнее значение только тогда, когда вам нужно после каждого значения, вам нужно изменить свой шаблон следующим образом

(ip|ec2)-((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)-){3}(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))($|(?:ec2|[^.]+\.compute)\.internal\.$)?

regex demo

И можно немного сократить

(ip|ec2)-((?:25[0-5]|2[0-4]\d|[01]?\d{1,2})-){3}(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2}))($|(?:ec2|[^.]+\.compute)\.internal\.$)?

Regex demo


Вы можете использовать визуализатор регулярных выраженийинструмент для визуального представления, Regeulex

enter image description here

1 голос
/ 26 октября 2019

Кажется, что \- это ваша проблема. Он присутствует только в последнем варианте (когда сегмент находится между 0 и 199). Самое простое решение - добавить это к первой и второй альтернативе: (ip|ec2)-((?:25[0-5]\-|2[0-4][0-9]\-|[01]?[0-9][0-9]?\-){3}(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)))($|(?:ec2|[^.]+\.compute)\.internal\.$)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...