[英]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.