阅读直到只有部分已知的行 - Python

时间:2016-06-07 08:46:34

标签: python regex

我需要从设备中获取(解析)它的整个输出。

我的解决方案是:1)确定输出的最后一行是怎样的

2)使用下面的代码读取输出直到最后一行(这是一种说法 - 读取整个输出)

last_line = "text of the last line"
read_until(last_line)

3)技术细节:将return的{​​{1}}值作为将其进一步传递给get_output()函数的方法。

问题是:最后一行可能采用各种形式,只有粗略的格式才知道。例如,它可能会说:parse_result()。但是,{"diag":"hdd_id", "status":"0"}"diag"可能采用除"status""hdd_id"之外的其他值。

如何制作最后一行"的文字"更通用,以便read_until()为" diag"的每个值停止和"状态"? (鉴于输出总是包含单词" diag"和" status")

我尝试过:使用正则表达式。使用正则表达式中"0"表示任何值的事实定义last_line = re('"status":"."}')。我得到的是.

通过TypeError: 'module' object is not callable将正则表达式转换为字符串也没有多大意义,因为据我理解正则表达式,它不代表任何特定的字符串(由于str(re('"status":"."}')))。

1 个答案:

答案 0 :(得分:0)

您应该(再次)阅读Python标准库手册中的re章节。

正确用法是:

import re
...
eof = re.compile(r'\s*\{\s*"diag":.*,\s*"status":.*\}') # compile the regex
...

上面的表达式使用\s*来允许行中的可选空格。如果您知道它们不会发生,您可以删除它们。

然后,您可以将其与telnetlib Python模块一起使用,但使用expect代替read_until,因为后者搜索字符串而不是正则表达式:

index, match, text = tn.expect([eof])

这里,index将匹配正则表达式的索引(此处为0),匹配匹配对象,并发送包含最后一行的全文