首页 > 解决方案 > 搜索 ip 地址的正则表达式

问题描述

我需要您的帮助来设置正则表达式以从 dns 名称中获取 ip 地址

我写了一个小脚本:

#!/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 的值,并且一切正常。我的正则表达式有问题

请您帮忙找出这种行为的原因并优化表达式 Idea select ip address from dns name。

谢谢

标签: pythonregex

解决方案


您的代码的问题是交替,您-只在最后一个值中包含了在每个值之后需要它的地方,您需要以下列方式更改您的模式

(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

在此处输入图像描述


推荐阅读