我正在尝试从设备中提取温度,并且正在通过串行发送命令以获取计算机的响应。
响应(即字符串)为b'wf_test m_temp \r\nmain card temp=31500 (31.5 oC)\r\n[root@testest:~]# \r\n[root@testest:~]# '
下面的代码正在工作,我只是想知道如何使它更具移动性(这意味着我可以将其用于其他机器,以便提取其温度,而不必更改位置参数来切片。字符串放在正确的位置)。我尝试了find
方法,但是它只是给我字符串的位置,我不确定如何继续。现在,代码将包含温度字符串(31.5)的字符串切成薄片并进行比较。
import serial
from time import sleep
ser = serial.Serial('COM3', timeout=1)
ser.baudrate = 115200
def temp_read ():
temp = b"wf_test m_temp \r\n"
ser.write(temp)
result = ser.read(1000)
print(result)
str1 = str(result)
str1.find('(')
str2 = str1[43:47]
print(str2 +' oC')
float(str2)
if float(str2) < 70:
print('Pass')
else:
print('Fail')
我希望能够发现oC
到字符串上并向后切,以便获得温度并进行比较。
答案 0 :(得分:2)
您可以在此处使用正则表达式,例如尝试使用re.findall
:
inp = "wf_test m_temp \r\nmain card temp=31500 (31.5 oC)\r\n[root@testest:~]# \r\n[root@testest:~]# "
temps = re.findall(r'\((\d+(?:\.\d+)?) oC\)', inp)
print(temps)
此打印:
['31.5']
使用\((\d+(?:\.\d+)?) oC\)
的正则表达式模式将以(31.5 oC)
之类的每个温度作为目标。
编辑:
使用以下方法获取整数温度:
temps = re.findall(r'\btemp=(\d+)', inp)
答案 1 :(得分:1)
您可以使用正则表达式来识别结果中的模式"\r\n", label, "=", digits
(即"\r\nmain card temp=31500"
)。
以下,matches
是字符串中所有找到的温度的列表。通常只有一场比赛。因此,这将输出:"main card temp: Pass"
作为示例输入。
import re
import serial
from time import sleep
ser = serial.Serial('COM3', timeout=1)
ser.baudrate = 115200
def temp_read():
ser.write(b"wf_test m_temp \r\n")
result = ser.read(1000).decode()
matches = re.findall(r"\r\n([^=]+)=(\d+)", result)
if matches:
# matches will be like [('main card temp', '31500')]
label = matches[0][0]
temp = int(matches[0][1]) / 1000
print(label + ': ' + ('Pass' if temp < 70 else 'Fail'))
else:
print('No temperature found in "%s"' % result)
表达式是
\r\n # CR + LF
([^=]+) # group 1 (label): multiple characters other than "="
= # "="
(\d+) # group 2 (temp): multiple digits