有没有更自动化的方式来发现子串?

时间:2019-08-28 06:54:05

标签: python string substring

我正在尝试从设备中提取温度,并且正在通过串行发送命令以获取计算机的响应。 响应(即字符串)为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到字符串上并向后切,以便获得温度并进行比较。

2 个答案:

答案 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