gpt4 book ai didi

python - 剪切Python中串行读取的字符串的子字符串

转载 作者:行者123 更新时间:2023-12-01 05:01:00 25 4
gpt4 key购买 nike

我试图找到答案,但无法解决我的问题。我通过串行命令用树莓派读取信号。这很完美。我收到一个特殊长度的字符串。代码如下所示:

import serial
import time
import re

ser = serial.Serial(
port = '/dev/ttyUSB0',
baudrate =19200,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS)

ser.open()
ser.write('send' + '\r\n')
time.sleep(1) # gives the device time to answer
out = ser.read(48) # size=48 equals one line output

输出的一个示例如下所示:

aw=   1.100 T=  94.2 'C  H20=   530 ppm

因为一行中有 3 个值,所以我尝试将这 3 个值与字符串分开,以获得仅包含这些值的 3 个子字符串。首先,我这样做是为了仅分离 aw 的值:

aw = re.search('aw=(.+?)T', out).group(1)

然后我收到这样的子字符串:___1.100

但是字符串中仍然留有空格。我尝试用 aw.strip() 剪切空格,但它不起作用。问题是空间的数量随值的不同而变化,如果温度更高,我得到的空间就会更少,所以我不能只削减 3 个空间。用序列号读取空格有什么特别的地方吗?或者我忘记剪掉空格了?我用普通的字符串尝试过它可以工作,但是使用我用串行命令读取的字符串则不行。谢谢您的帮助!最大

最佳答案

>>> out="aw=   1.100 T=  94.2 'C  H20=   530 ppm"
>>> [float(v) for v in out.split() if not v.strip('0123456789.')]
[1.1, 94.2, 530.0]

如果要将值分配给变量:

>>> aw, T, h2o = [float(v) for v in out.split() if not v.strip('0123456789.')]
>>> print aw, T, h2o
1.1 94.2 530.0

它是如何工作的

split 将分离出字符串:

>>> out.split()
['aw=', '1.100', 'T=', '94.2', "'C", 'H20=', '530', 'ppm']

下一个问题是我们要删除注释并只保留数字。数字字符串仅由 0123456789. 组成。因此,如果字符串包含任何其他字符,我们要跳过它。为此,我们通过 v.strip('0123456789.') 删除所有非数字字符,如果仍有任何字符,我们将跳过该字符串。

因此,如果字符串中存在一个或多个非数字字符,则 v.strip('0123456789.') 为非空 (True)。因此,仅当所有字符都属于数字时,not v.strip('0123456789.') 才为 True。

作为示例,我们在这里使用此测试来显示 1.2 是有效数字,但 H2O 不是:

>>> not 'H2O'.strip('0123456789.')
False
>>> not '1.2'.strip('0123456789.')
True

因此,列表理解将有效数字转换为 float 并忽略其他字符串。

关于python - 剪切Python中串行读取的字符串的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26228754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com