我已经有了regex(以及围绕每个regex的一些行为,分别使用Python的re.findall()和re.search()的IPv4地址、IPv6地址、邮件服务器名称和私有IP地址)。私有IP属于以下范围:
10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255裁判官:
#Mail server ([a-zA-Z0-9-]+\.){2,3}[a-zA-Z]+
#Private IP (?:10|127|169|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168|169\.254)\..*
#IPv4 \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
#IPv6 ([a-z0-9]{1,4}:+){3,5}[a-z0-9]{1,4}现在我需要添加一些流量控制。考虑到使用regex,我们可以匹配全局的、非贪婪的等等,组合模式等等。我更愿意利用这个事实(将regex的regex合并成一个Python表达式),而不是使用多个if/else的单独执行。下面是一个典型的字符串:
Received: from [192.168.0.140] (n11649196059.netvigator.com. [116.49.196.59])
by mx.google.com with ESMTPSA id w12sm4743917pbs.68.2015.06.04.16.21.51
for <someaddress@gmail.com>
(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
Thu, 04 Jun 2015 16:21:52 -0700 (PDT)下面是我要做的每一个字符串的伪代码,如下所示:
if any IPv4 or IPv6 address matches:
if firstMatch is not private: # Private meaning matches "Private IP" regex above
return firstMatch
else:
#continue through string to look for another IP address
if found nextMatch:
if nextMatch is not private:
return nextMatch
#else continue through string to look for another IP address,
#again checking for privacy. If none found, just return firstMatch
return firstMatch
# no valid IP address found, look for mail server now
else:
if matchedAmailServer:
return mailServer在上面的示例字符串中,192.168.0.140是私有的,所以我将继续执行该字符串,直到找到下一个IP地址。下一个地址是116.49.196.59,不是私人地址,所以这就是我返回的地址。另一方面,如果字符串中没有第二个IP地址,我希望返回mx.google.com。
在这里,如何最好地智能地使用Python的re函数,以便最大限度地提高正则表达式的能力,并将if/ use的数量最小化?
发布于 2015-06-10 21:41:24
如果您可以区分您感兴趣的类,只需按以下顺序搜索它们:
ip_addr = re.findall(RE_ADDRESSES, response)
non_private = [ x for x in ip_addr if not re.match(RE_PRIVATE, x) ]
if non_private:
return non_private[0]
# They're all private: return first one
elif ip_addr:
return ip_addr[0]
mailserver = re.findall(...)[0]
return mailserver注意,由于return终止了执行,所以我没有使用else子句--这样代码就不会嵌套得太深。如果你愿意的话,你可以添加它们。
https://stackoverflow.com/questions/30767168
复制相似问题