首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Regex:如何最好地将regex与条件词(在Python中)结合起来?

Regex:如何最好地将regex与条件词(在Python中)结合起来?
EN

Stack Overflow用户
提问于 2015-06-10 20:57:28
回答 1查看 92关注 0票数 0

我已经有了regex(以及围绕每个regex的一些行为,分别使用Python的re.findall()re.search()的IPv4地址、IPv6地址、邮件服务器名称和私有IP地址)。私有IP属于以下范围:

代码语言:javascript
运行
复制
10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255

裁判官:

代码语言:javascript
运行
复制
#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的单独执行。下面是一个典型的字符串:

代码语言:javascript
运行
复制
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)

下面是我要做的每一个字符串的伪代码,如下所示:

代码语言:javascript
运行
复制
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的数量最小化?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-10 21:41:24

如果您可以区分您感兴趣的类,只需按以下顺序搜索它们:

代码语言:javascript
运行
复制
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子句--这样代码就不会嵌套得太深。如果你愿意的话,你可以添加它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30767168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档