Python 基于列表/数组的len创建动态变量

Python 基于列表/数组的len创建动态变量,python,arrays,python-2.7,list,Python,Arrays,Python 2.7,List,我试图写一个程序,在思科路由器上运行一个命令,并在文本文件中写入IP列表。我能够将所有IP写入文件,然后成功获取所有IP。现在我遇到的问题是,我不知道我将从列表中获得多少IP。由于我想将从文件中获得的每个IP与用户定义的IP进行比较,所以我想找到一种方法,或者基于IP的#创建动态变量,或者以某种方式迭代所有IP并将其与用户的IP进行比较 import re import ipaddr userIP = raw_input('Enter IP address to compare i.e, 10

我试图写一个程序,在思科路由器上运行一个命令,并在文本文件中写入IP列表。我能够将所有IP写入文件,然后成功获取所有IP。现在我遇到的问题是,我不知道我将从列表中获得多少IP。由于我想将从文件中获得的每个IP与用户定义的IP进行比较,所以我想找到一种方法,或者基于IP的#创建动态变量,或者以某种方式迭代所有IP并将其与用户的IP进行比较

import re
import ipaddr

userIP = raw_input('Enter IP address to compare i.e, 10.10.10.0/24:')
ipFile = ("router.com.txt")
found = []
with open(ipFile, 'r') as f:
    for text in f.readlines()[1:]: #File had a blank line so this skips it
        text = text.rstrip()
        regex = re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\/(?:[\d]{1,3})', text)
        #print regex
        found.append(regex)
    print found
    print len(found) - 1
这是我运行它时得到的结果:

[['10.10.20.192/27'], ['10.10.40.0/24'], []]
2
现在,我所面临的困难是如何将它们与变量userIP进行动态比较

#if userIP.overlaps(found):
#print "Overlapping IPs!!"
#else:
#print "Does not Overlap!!" 
谢谢
Damon

您可以将每个IP地址与用户输入子网逐一进行比较,如下所示(实际上,它使用的内存比您的代码少):


您可以将每个IP地址与用户输入子网逐一进行比较,如下所示(实际上它使用的内存比您的代码少):


这是你想要的吗

append
更改为
extend
,使生成的列表类似于
['10.10.20.192/27','10.10.40.0/24','']

found.extend(regex)
询问
userIP
是否与找到的任何一个匹配:

if userIP in found:
    <suite>
如果在中找到userIP:

这是你想要的吗

append
更改为
extend
,使生成的列表类似于
['10.10.20.192/27','10.10.40.0/24','']

found.extend(regex)
询问
userIP
是否与找到的任何一个匹配:

if userIP in found:
    <suite>
如果在中找到userIP:

我认为,一旦考虑到
re.findall
将在文件本身的所有行上提取所有IP,就可以避免很多复杂性,您不需要有自己的循环。例如:

import re

userIP = raw_input('Enter IP address to compare i.e, 10.10.10.0/24:')
ipFile = "router.com.txt"

with open(ipFile) as f:
    for ip in re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\/(?:[\d]{1,3})', f.read()):
        if overlaps(ip, userIP):
            print "Overlapping IPs!!"
            break

overlaps()
函数只是一个虚构的示例,有助于说明其余的逻辑。

我认为,考虑到
re.findall
将拉出文件本身所有行上的所有IP,就可以避免很多复杂性,而不需要有自己的循环。例如:

import re

userIP = raw_input('Enter IP address to compare i.e, 10.10.10.0/24:')
ipFile = "router.com.txt"

with open(ipFile) as f:
    for ip in re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\/(?:[\d]{1,3})', f.read()):
        if overlaps(ip, userIP):
            print "Overlapping IPs!!"
            break


overlaps()
函数只是一个虚构的示例,有助于说明其余的逻辑。

如果您使用的是Python 3.3+,看起来可以使用内置库。但是,对于Py2.7,您仍然可以使用一个backport包:我使用的是ipaddr.py,它对我来说运行良好。我需要关于动态变量部分的帮助你所说的“动态变量”是什么意思?我是编程新手,所以这是我脑海中出现的第一件事。由于列表长度是动态的,所以除了动态分配创建IP和分配所有IP之外,我想不出其他方法。如果有更好的方法,我将使用itDamon:大多数容器,如列表和字典,都是可变的,这意味着它们的内容几乎可以随时更改。对我来说,“动态变量”是程序在运行时创建和命名的变量,这通常被认为是一个坏主意,通常可以通过使用可变容器来避免。如果您使用的是Python 3.3+,看起来您可以使用内置库。但是,对于Py2.7,您仍然可以使用一个backport包:我使用的是ipaddr.py,它对我来说运行良好。我需要关于动态变量部分的帮助你所说的“动态变量”是什么意思?我是编程新手,所以这是我脑海中出现的第一件事。由于列表长度是动态的,所以除了动态分配创建IP和分配所有IP之外,我想不出其他方法。如果有更好的方法,我将使用itDamon:大多数容器,如列表和字典,都是可变的,这意味着它们的内容几乎可以随时更改。对我来说,“动态变量”是程序在运行时创建和命名的变量,这通常被认为是一个坏主意,通常可以通过使用可变容器来避免。我按原样编辑代码,如果userIP.overlaps(find):而不是if subnet.overlaps(find):同样,我明白了:AttributeError:'str'对象没有属性“重叠”@Damon你说你正在使用
ipaddr.py
。条件测试实际上是您的伪代码。是否要我将其更改为使用
ipaddress
?条件测试实际有效(ipaddr.py)。例如:if userIP.overlaps(found):我硬编码了userIP并找到了变量,它的工作方式与预期相同。@Damon:the
userIP
是通过
raw\u input
输入的,它必须是
str
。您是否使用该值在以后的某个地方创建了对象?这是最终计划,但为了更快的测试,我硬编码了它:userIP=“10.10.10.0/24”我编辑了代码,因为它是if userIP.overlaps(find):而不是if subnet.overlaps(find):另外,我明白了:AttributeError:'str'对象没有属性“重叠”@Damon你说你正在使用
ipaddr.py
。条件测试实际上是您的伪代码。是否要我将其更改为使用
ipaddress
?条件测试实际有效(ipaddr.py)。例如:if userIP.overlaps(found):我硬编码了userIP并找到了变量,它的工作方式与预期相同。@Damon:the
userIP
是通过
raw\u input
输入的,它必须是
str
。您是否使用该值稍后在某处创建了对象?这是最终计划,但为了更快地进行测试,我将其硬编码为:userIP=“10.10.10.0/24”@Philip Tzou,在我修复了一个明显的问题后,您的解决方案起了作用。你能告诉我哪一个是更好的解决方案吗?这个列表通常不会增长超过10个IP,但我可能会在将来的项目中使用它。哪一个更有效?谢谢大家的帮助;)@Philip Tzou和你的解决方案在我解决了一个明显的问题后起了作用。你能告诉我哪一个是更好的解决方案吗?这个列表通常不会增长超过10个IP,但我可能会在将来的项目中使用它。哪一个更有效?谢谢大家的帮助;)