【问题标题】:split() on one character OR anothersplit() 在一个字符或另一个字符上
【发布时间】:2017-05-24 15:17:40
【问题描述】:

Python 3.6.0

我有一个程序可以解析 Cisco 交换机和路由器的输出。

我在程序中到达了一个点,我从“sh ip int brief”返回输出 命令。

我将它放在一个列表中,这样我就可以拆分“>”字符并提取主机名。

完美运行。相关代码sn-p:

    ssh_channel.send("show ip int brief | exc down" + "\n")
    # ssh_channel.send("show ip int brief" + "\n")
    time.sleep(0.6)
    outp = ssh_channel.recv(5000)
    mystring = outp.decode("utf-8")
    ipbrieflist = mystring.splitlines()
    hostnamelist = ipbrieflist[1].split('>')
    hostname = hostnamelist[0]

如果路由器处于“启用”模式,则命令提示符在主机名后有一个“#”字符。

如果我将程序更改为在“#”字符上拆分:

    hostnamelist = ipbrieflist[1].split('#')

它仍然可以完美运行。

如果输出在“ipbrieflist”中有“>”字符或“#”字符,我需要程序来处理。

我找到了几个有关如何处理此问题的有效参考资料。例如:

import re
text = 'The quick brown\nfox jumps*over the lazy dog.'
print(re.split('; |, |\*|\n',text))

以上代码完美运行。

但是,当我如下修改我的代码时:

    hostnamelist = ipbrieflist[1].split('> |#')

它不起作用。 “不起作用”是指它不会在任何一个字符上分裂。完全没有分裂。

以下调试来自 PyCharm:

ipbrieflist = mystring.splitlines() ipbrieflist={list}: ['终端长度 0', 'rtr-1841>show ip int brief | exc down', 'Interface'] IP-Address OK?方法状态协议','FastEthernet0/1 192.168.1.204 YES NVRAM up up','Loopback0 172.17.0.1 YES NVRAM up up','','rtr-1841>'] hostnamelist = ipbrieflist[1].split('> |#') hostnamelist={list}: ['rtr-1841>show ip int brief |除外'] 主机名 = {str}'rtr-1841>show ip int brief |排除'

如您所见,主机名变量仍然包含“show ip int brief | exc down' 附加到它。

如果主机名后跟“#”字符,我会得到完全相同的行为。

我做错了什么?

谢谢。

【问题讨论】:

  • 呃,re.split != str.split

标签: python-3.x split


【解决方案1】:

而不是这个:

ipbrieflist[1].split('> |#')

你想要这个:

re.split('>|#', ipbrieflist[1])

【讨论】:

  • 这行得通——但是——PyCharm 给了我一个关于使用不同语法的警告,它说它要快得多:hostnamelist = re.split('[>#]', ipbrieflist[1])这也有效。
  • @MarkS: 是的[] 更好,我只是不想混淆这个问题。
猜你喜欢
  • 1970-01-01
  • 2021-06-15
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2021-11-28
  • 2011-08-21
相关资源
最近更新 更多