剪切一个字符串的子字符串,该字符串在Python中由串行读取

时间:2014-10-07 04:52:02

标签: python raspberry-pi

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

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个值与String分开,以获得仅包含值的3个子串。 首先,我这样做只是为了分隔aw的值:

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

然后我收到一个像这样的子串:___ 1.100

但是我仍然在String中留下了空格。我试图用aw.strip()剪切空格但它不起作用。问题是空间的数量与价值不同,如果我得到更高的温度,我得到更少的空间,所以我不能只切3个空格。 是否有任何特殊的空格与序列读取或有什么我忘了切断空格?我尝试使用普通的String工作,但是我用串行命令读取的字符串却没有。 谢谢您的帮助! 最大

2 个答案:

答案 0 :(得分:2)

>>> 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.')仅在所有字符都属于数字时才为真。

例如,我们在此处使用此测试来显示1.2是有效数字,但H2O不是:

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

因此,列表推导将有效数字转换为浮点数并忽略其他字符串。

答案 1 :(得分:0)

aw=\s*(\S+)\s*T

您可以将正则表达式更改为此。您的代码可以正常工作而不提供任何空格。

aw = re.search('aw=\s*(\S+)\s*T', out).group(1)

参见演示。

http://regex101.com/r/hQ1rP0/27