簡體   English   中英

如何使用 python 正則表達式從大量顯示的 output 中提取特定消息?

[英]How to extract particlar message from a vast displayed output using python regular expression?

  1. 首先在代碼中,我想知道如何為 CH (1-11) 添加 for 循環而不是為每個數字編寫
  2. 還有如何從 output 中提取 SUCCESS 和 FAILED 消息(參考)例如我想要 output 作為

CH1:失敗

CH2:成功

CH3:失敗

: 很快

我想為此使用正則表達式而不是 json。

import pexpect
  def quick_test():   
    ch = pexpect.spawn('ssh to server')
    ch.logfile = sys.stdout
    ch.expect("Select channels")
    print ("\n########################################\n")
    ch.sendline("1")
    ch.expect("Enter ch to run:")
    ch.sendline("CH1,0")
    var1=ch.after
    print(var1)
    ch.expect("Enter Test:")
    var2=ch.before
    print(var2)
    ch.sendline("CH2,0")
    ch.expect("Enter Test:")
    var3=ch.before
    print(var3)
    ch.sendline("CH3,0")
    ch.expect("Enter Test:")
    var4=ch.before
    print(var4)
    ch.sendline("CH4,0")
    ch.expect("Enter Test:")
    var5=ch.before
    print(var5)
    ch.sendline("CH5,0")
    ch.expect("Enter Test:")
    var6=ch.before
    print(var6)
    ch.sendline("CH6,0")
    ch.expect("Enter Test:")
    var7=ch.before
    print(var7)
    ch.sendline("CH7,0")
    ch.expect("Enter Test:")
    var8=ch.before
    print(var8)
    ch.sendline("CH8,0")
    ch.expect("Enter Test:")
    var9=ch.before
    print(var9)
    ch.sendline("CH9,0")
    ch.expect("Enter Test:")
    var10=ch.before
    print(var10)
    ch.sendline("CH10,0")
    ch.expect("Enter Test:")
    var11=ch.before
    print(var11)
    ch.sendline("CH11,0")

if __name__ == '__main__':
    quick_test()

output:

    output
    ###########################################
    There are plenty of output displayed in which these below lines are included and 
    not in the given order and are displayed randomly.

CH1,0 Result: FAILED
CH2,0 Result: SUCCESS
CH3,0 Result: FAILED
CH4,0 Result: SUCCESS
CH5,0 Result: SUCCESS
CH6,0 Result: SUCCESS
CH7,0 Result: FAILED
CH8,0 Result: SUCCESS
CH9,0 Result: FAILED
CH10,0 Result: SUCCESS
CH11,0 Result: FAILED

1.首先在代碼中,我想知道如何為 CH (1-11) 添加 for 循環而不是為每個數字編寫

從“CH2”開始的基本可重復單位是:

ch.sendline("CH2,0")
ch.expect("Enter Test:")
var3=ch.before
print(var3)

我們將不使用命名變量,而是使用一個包含列表數據結構的變量來保存 n 個值:

vars = []

我們使用 for 循環迭代到 11:

for i in range(11):
    ch.sendline("CH{},0".format(i+1))
    ch.expect("Enter Test:")
    vars[i]=ch.before
    print(vars[i])

第一個變量的處理方式不同,因此我們在循環外處理它:

vars = []
ch.expect("Enter ch to run:")
ch.sendline("CH1,0")
var1s[0]=ch.after
print(var1)
for i in range(1, 11):
    ch.sendline("CH{},0".format(i+1))
    ch.expect("Enter Test:")
    vars[i]=ch.before
    print(vars[i])

這應該將相同的文本打印到顯示器上,並且您的值仍應存儲在vars列表中。 例如,以前在var8中的內容現在將在vars[7]中(因為 arrays 是零索引)。

2. 還有如何從 output 中提取 SUCCESS 和 FAILED 消息(參考)

使用正則表達式,例如此模式:

^(CH\d{1,}),0 Result: (SUCCESS|FAILED)$

您將在兩個位置捕獲組中獲得所需的字符串。

您可以再次使用 for 循環匹配 output 中的每一行(假設此 output 存儲在某處,例如從文件中讀入,而不是簡單地打印到顯示器)。

使用 Python 的re模塊:

pattern = r"^(CH\d{1,}),0 Result: (SUCCESS|FAILED)$" # r-string
sampleOutputLine = "CH1,0 Result: FAILED"
m = re.match(pattern, sampleOutputLine)

print(m.groups())

Output:

('CH1', 'FAILED')

然后,您可以根據需要格式化組,例如:

formattedOutputLine = "{}: ".format(m.groups[0])
if m.groups[1] === "SUCCESS":
    formattedOutputLine += m.groups[1]
else:
    formattedOutputLine += m.groups[1].lower()

假設 output 行作為字符串列表存儲在變量output中,其中每個字符串是一行:

pattern = r"^(CH\d{1,}),0 Result: (SUCCESS|FAILED)$" # r-string

formattedOutput = []
for line in output:
    m = re.match(pattern, line) # consider compiling the pattern beforehand if your output is large, for performance
    formattedOutputLine = "{}: ".format(m.groups[0])
if m.groups[1] === "SUCCESS":
    formattedOutputLine += m.groups[1]
else:
    formattedOutputLine += m.groups[1].lower()
    
    formattedOutput.append(formattedOutputLine)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM