簡體   English   中英

pexpect.expect('(?<=Code:\\s).*(?=[\\r\\n])') 有時會從多行輸出中得到意想不到的結果

[英]pexpect.expect('(?<=Code:\s).*(?=[\r\n])') sometimes got unexpected result from multiline output

我是學習 python 和 pexpect 的新手,我試圖從某些命令輸出中檢查字典是否等於某個字符串,但由於某種原因,字符串比較在極少數情況下失敗,但大部分時間都通過了。

假設我向我的終端發送了一些名為list命令,它會輸出某個產品的詳細信息:

->list
Color: Maroon Red
Height: 150cm
Code: 4KG-LV
Material: Aluminum
Brand: Toyota 
#and hundreds of more lines...

我有一個代表字典的變量,當我使用print(license_type)打印它時輸出它:

{'license': '4kg-lv'}

我基本上想檢查list命令輸出中的代碼4KG-LV是否等於字典中許可證中的值4kg-lv

這樣做:

exp.sendline("list")
exp.expect('(?<=Code:\s).*(?=[\r\n])')
firstString = exp.after
print(firstString) 

使用正則表達式解析 list 命令的輸出並獲取/打印值4KG-LV

如果我將所有這些放在一個 python 腳本中並檢查兩個值是否相等,它應該通過檢查,因為我打印了這兩個字符串並且它們在我的終端上看起來相同。 但是,當我嘗試檢查第一個字符串(list 命令中的代碼)是否等於字典值時,它會在 95% 的情況下通過 EQUAL,但在極少數情況下它會由於某種原因導致比較失敗,並且我不知道為什么。

license_type = {'license': '4kg-lv'}
exp.sendline("list")
exp.expect('(?<=Code:\s).*(?=[\r\n])')
codeString = exp.after

firstString = codeString.lower().strip(' \t\n\r')
secondString = licenseType.get("type").lower().strip(' \t\n\r')

if firstString == secondString
    print("EQUAL")
else:
    print("NOT EQUAL")

我在這部分代碼上方有很多命令和輸出,我不確定它是否在讀取額外的空間或\\n有時當我運行腳本時? 比較失敗,可能每 30-40 次運行一次。 如果沒有.strip(' \\t\\n\\r')它每次都會自動失敗,但是添加它似乎使它在大部分時間通過,但我不確定是什么導致它在極少數情況下失敗。

是否有可能為時已晚忽略空格/制表符? 我應該在.lower()之前添加strip.(' \\t\\n\\r') .lower()嗎?

看來你該換了

exp.expect('(?<=Code:\s).*(?=[\r\n])')

exp.expect('(?<=Code:\s)[^\r\n]*(?=[\r\n])')

否則,貪婪的.*可能會匹配交叉換行符(取決於應用程序輸出的速度和 pexpect 讀取數據的速度) ,例如, "4KG-LV\\r\\nMaterial: Aluminum"


例子:

一個簡單的 pexpect 腳本foo.py

import pexpect, sys

p = pexpect.spawnu('bash -c "echo : foo; ((RANDOM % 2)) && sleep .1; echo : bar" ')
p.expect('(?<=:\s).*(?=[\r\n])')
matched = p.after
p.expect(pexpect.EOF)

print('MATCHED: %s' % repr(matched) )

嘗試一下:

$ for i in {1..10}; do python3 foo.py; done
MATCHED: 'foo\r\n: bar\r'
MATCHED: 'foo\r'
MATCHED: 'foo\r\n: bar\r'
MATCHED: 'foo\r'
MATCHED: 'foo\r'
MATCHED: 'foo\r'
MATCHED: 'foo\r'
MATCHED: 'foo\r\n: bar\r'
MATCHED: 'foo\r\n: bar\r'
MATCHED: 'foo\r\n: bar\r'

暫無
暫無

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

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