0

我正在开发一个 API,它从我们的后端提取一些连接信息,并将其设置为变量。需要一些关于如何解析这些数据的建议,以便在我需要的时候得到我需要的东西。下面是我的变量中的输出示例。

(ArrayOfString){
   string[] = 
      "Starting Up
- AuthCode OK
- Found 4123 Devices
Done
OK",
      "007.blahname.com AB Publishing   1.1.1.1 CentOS Linux 5.0            
",
      "027503-blah  test blah   1.1.1.2 NetScaler OS    Network Gathering   1.1.1.1 22
",
      "028072-;alskdjf; Alpha Group 192.168.19.100  CentOS Linux 5  SSH 2.2.2.2 2022
",
      "028072-4alksgjasdfserver Alpha Group 192.168.19.101  CentOS Linux 5  SSH 2.3.4.5 2022
",

不确定是否容易看到,但所有内容都是制表符分隔的。最后我需要的是,是否设置为列,所以我可以搜索设备名称(第 1 列),并读取关联的 IP、端口和连接方法(028072 示例中的第 7、8 和 6 列任何关于从哪里开始的
帮助/想法都会有所帮助。

4

3 回答 3

2

您可以使用标准库中的CSV 模块

于 2013-04-10T00:23:39.880 回答
0

我相信,您可以专门按制表符.split('\t')或按空格进行拆分。.split()

于 2013-04-10T00:19:10.190 回答
0

您向我们展示的内容类似于 C# 源代码。如果这就是您实际得到的,您需要首先从该源代码中解析字符串,然后您可以从这些字符串中解析列。

所以,首先:

r = re.compile(r'"(.*?)"', re.MULTILINE | re.DOTALL)
lines = r.findall(data)

接下来,第一个字符串(其中包含一堆换行符的字符串)似乎是您想要跳过的某种标题信息。此外,每一行都有一个换行符。所以,让我们解决这两个问题:(我们可以在正则表达式中去掉换行符,但在这里也很容易做到。)

lines = [line.rstrip('\n') for line in lines[1:]]

现在,每个字符串都可以通过制表符分成列,对吧?

values = [line.split('\t') for line in lines]

而已。

作为替代方案,我们本可以完成StringIO(''.join(lines))并将其传递给csv.reader(sio, delimiter='\t')... 如果解析比 更复杂split,我可能会这样做。但在这种情况下,我认为它增加的复杂性多于节省的复杂性。


但是有一个问题。如果您已正确复制和粘贴,则这些字符串中没有制表符,它们有空格。而且,由于列本身具有内部空间,并且没有引用或转义,因此没有明确的方式来拆分它们。您可以编写一些启发式代码,通过猜测制表位来尝试重建制表符,假设任何 2 个或更多空格的运行都必须是制表符等,但这需要大量工作。

于 2013-04-10T01:10:15.953 回答