我试图找到答案,但我无法解决我的问题。 我通过串口命令用我的覆盆子读了一个信号。这很完美。我收到一个特殊长度的字符串。代码如下所示:
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工作,但是我用串行命令读取的字符串却没有。 谢谢您的帮助! 最大
答案 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)
参见演示。