Python 搜索ip地址的Regexp表达式

Python 搜索ip地址的Regexp表达式,python,regex,Python,Regex,我需要您帮助设置regexp表达式,以便从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.i

我需要您帮助设置regexp表达式,以便从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))
看起来不太好,我发现结果对我来说不太好:

字符串中的问题:

ip-10-27-209-104.us-east-1.compute.internal
如果我将209替换为小于200的值,那么所有这些都可以正常工作。 我的regexp表达式有问题吗

您能帮我找到这种行为的原因并优化表达式吗 从dns名称中选择ip地址


谢谢

看来
\-
是你的问题。它仅出现在最后一个选项中(当段介于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 compute internal$)

。它仅出现在最后一个选项中(当段介于0和199之间时)。最简单的解决方案是将其添加到第一个和第二个备选方案中:

[代码><代码><代码><代码><知识产权(ip地址><知识产权><知识产权><知识产权><知识产权(ip地址>[知识产权)ec2(ec2)2(25[0-5[0-5[0-5[0-5]25[0-5[0-5[0-5[0-5]25[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5[0-5]5方式

(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\.$)?

而且可以缩短一点

(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\.$)?


您可以使用正则表达式可视化工具获得可视化表示


代码的问题是交替,最后一个值中只包含了
-
,因为在每个值之后都需要它,所以需要按照以下方式更改模式

(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\.$)?

而且可以缩短一点

(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\.$)?


您可以使用正则表达式可视化工具获得可视化表示


r”(ip | ec2)-((?:[0-9]+-)+[0-9]+)“
将提取所有ip地址为什么所有这些组都在您的正则表达式中?
r(ip | ec2)-(?:[0-9]+-+[0-9]+)”
将提取所有ip地址为什么所有这些组都在您的正则表达式中?谢谢,它可以工作,但在那个解决方案中,我失去了从中提取IP的可能性group@EduardAhmatgareev您可以简单地在捕获的组中添加ip,但不幸的是,我又发现了一个适用于me域的错误案例:“ip-10-27-212-164.ec2.internal”、“ip-10-27-212-164.ec2.int”、“ip-10-27-212-164.ec2”、“ip-10-27-212-164.ec”“``还返回了组,并传递了regexp,但它是错误的域谢谢,它可以工作,但在该解决方案中,我失去了从中提取IP的可能性。”group@EduardAhmatgareev您可以简单地将ip添加到捕获的组中。不幸的是,我又发现了一个适用于me域的错误案例:``` ip-10-27-212-164.ec2.internal“,”ip-10-27-212-164.ec2.int“,“ip-10-27-212-164.ec2”、“ip-10-27-212-164.ec”``也返回了组,并传递了regexp,但它是错误的域