python - 搜索 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。
谢谢
解决方案
您的代码的问题是交替,您-
只在最后一个值中包含了在每个值之后需要它的地方,您需要以下列方式更改您的模式
(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\.$)?
您可以使用正则表达式可视化工具来获得可视化表示,Regeulex
推荐阅读
- ios - Xcode:仅在插入 PKI 密钥时无法在钥匙串中找到指定的项目
- c# - 有没有办法假装来自切换按钮的 handleCheck 从未发生过?
- react-native - 滚动视图中的屏幕滞后
- r - 如何将样本大小文本添加到 facet_wraped 十六进制图
- python - mlflow 是否支持集群部署?
- javascript - 在控制台中编写无意义的命令后,如何防止 Google chrome 加载旧的 javascript?
- c# - 无法从表存储中获取记录
- android - 为什么 ACTION_CARRIER_CONFIG_CHANGED 没有触发我的接收器?
- clojure - (read-line) 在 preceing prinln 之前执行
- geometry - 如何检查 line-polygon-intersection *包括* 为每个交叉点找到多边形的边?