需要帮助我的 python 脚本显示索引错误

Posted

技术标签:

【中文标题】需要帮助我的 python 脚本显示索引错误【英文标题】:Need help my python script showing index error 【发布时间】:2020-02-07 03:39:35 【问题描述】:

从下面的配置中,我需要提取主机名和组名邻居 x.x.x.x 信息,

#

-设置系统主机名devicename_ABC

-set protocols bgp group 组名类型内部

-set protocols bgp group 组名邻居 x.x.x.x

-set protocols bgp group 组名邻居 z.z.z.z

#

我在 python 脚本下面写了,但它显示索引错误。请帮我解决这个问题。

Python 脚本:

        reDeviceName = re.compile(r'#\s*\n\s*host (\S*)\s*',re.DOTALL)
        deviceName = reDeviceName.findall(allText)
        regBbpGroup = re.compile(r'\s*bgp group (\S*)\s*',re.DOTALL)
        bpGroupList = regBbpGroup.findall(allText)
        numBbpGroup = len(bpGroupList)
        i = 0
        def temp(x):
            return x

        while i < numBbpGroup:
            requiredInfo = list(map(temp,bpGroupList[i]))
            requiredInfo.insert(0,deviceName[0]) (index error showing for this line)
            bpGroupList = str(requiredInfo[2])
            i = i + 1

【问题讨论】:

可能需要看看allText里面有什么。 所有文本包含以下信息 --set system host-name devicename_ABC -set protocols bgp group Group-name type internal -set protocols bgp group Group-name neighbor xxxx -set protocols bgp group Group-name neighbor zzzz 我认为这不是用于reDeviceName 的正确正则表达式。您希望该模式返回什么? 我想从路由器命令行收集设备名称和 BGP 组名称应该是正确的命令 【参考方案1】:

numBbpGroup = len(bpGroupList) - 1

使用它,它会很好地为您服务。 python中的length函数从1开始计数,数组索引从0开始

【讨论】:

尝试打印设备名称。也许它是空的,并且您没有正确的回复。【参考方案2】:

编辑:这不是你当前IndexError 的原因,但是如果你只修复你的设备名称字符串正则表达式,当你尝试访问bpGroupList[i] 时,你会得到另一个IndexError i = len(bpGroupList)

将您的 while 循环更改为 for 循环。另一个答案建议从您的 numBbpGroup 变量中减去 1,但是变量的名称会产生误导。 range 函数旨在以这种minus 1 方式运行。所以不要说

while i < numBbpGroup:
    ...
    i = i + 1

你可以说

for i in range(numBbpGroup):
    ...

它会正常工作。 i 将从 1 上升到 numBbpGroup - 1,您不需要在 for 循环版本中增加 i

编辑:我感觉您的设备名称变量是一个空字符串,这就是导致您看到的索引错误的原因。

【讨论】:

用于循环但仍显示索引错误...我想在此处发布完整脚本但大小太大。如果您看到完整的脚本,您可能会发现问题 如果IndexError 仍然发生在同一行(您说deviceName[0]),那么您需要进行一些调试并弄清楚deviceName 到底是什么。使用您的 IDE,弄清楚如何使用集成调试器并在此行之前设置一个断点。知道如何使用调试器是一项非常宝贵的技能,这是一个绝佳的机会。【参考方案3】:

你可以试试这个积极的后向正则表达式吗?我假设您想要在字符串host-name 之后进行测试。

reDeviceName = re.compile(r'(?<=host-name).*')

【讨论】:

你能print(len(deviceName))吗?我猜是0 我的正则表达式有错字。脱掉最后一个)。我编辑了我的答案。

以上是关于需要帮助我的 python 脚本显示索引错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Tkinter GUI 中显示 Python 脚本的输出

需要Powershell脚本帮助

python argparse:如何在错误时自动显示帮助?

在没有任何参数的情况下调用脚本时使用 Python argparse 显示帮助消息

不能让 id 在 Python 中工作! Kivy 新手需要帮助

我的类别帮助命令运行不正常