我正在运行" Python 2.7.9(默认,2016年9月17日,20:26:04) Linux2" [GCC 4.9.2]在Ubuntu上。
我在序列中有如下行:
forEach
并希望解析此问题。我需要提取1.15和226作为数字,这样我就可以用这些数字进行数学运算。
我使用了以下python代码:
line="[99] nodeId=99 uptime=31987895 BarC=1.15 sensorVal=226 -"
这打印出来:
pressure=line.split()[3].split("=")[1:2]
print(pressure)
如何摆脱['1.15']
(撇号)和' '
并将其变成我可以用简单数学运算的东西。浮动数字可以。
以下是更多输出:
[ ]
答案 0 :(得分:4)
您可以使用re.findall
获得更广泛的解决方案:
import re
s = 'line="[99] nodeId=99 uptime=31987895 BarC=1.15 sensorVal=226 -"'
a, b = map(float, re.findall('\d+\.*\d+', s))[-2:]
print(a, b)
输出:
(1.15, 226.0)
编辑:假设您的输出为[[227.0, 99.0] [1.17, 227.0] [228.0, 99.0] [1.17, 227.0] [228.0, 99.0]]
,可以尝试:
s = [[227.0, 99.0] [1.17, 227.0] [228.0, 99.0] [1.17, 227.0] [228.0, 99.0]]
final_data = [i[0] for i in s[:2]]
答案 1 :(得分:1)
这是另一种解决方案:
import re
line="[99] nodeId=99 uptime=31987895 BarC=1.15 sensorVal=226 -"
print [float(_) for _ in (re.findall(pattern="=([\d\.]+)", string=line)[-2:])]
<强>输出:强> [1.15,226.0]
获取变量中的值:
(a, b) = (float(_) for _ in (re.findall(pattern="=([\d\.]+)", string=line)[-2:]))
print a, b
<强>输出:强> 1.15 226.0
答案 2 :(得分:1)
除非使用正则表达式,否则我想首先帮助您理解为什么会遇到问题。
看起来你已经编造了一长串方法调用,这些方法调用可以为你提供一些非常接近你想要的东西,而不需要注意返回值。让我们分解一下:
line
是一个字符串。 line.split()
返回line
中以空格分隔的字符串元素的列表。 [3]
获取列表的第四个元素,它也是一个字符串。 .split('=')
再次将其分成一个列表。 [1:2]
将第二个元素提取为子列表。您可以通过索引pressure[0]
来获取列表的第一个元素。一种更简单的方法是将索引提取为[1]
而不是[1:2]
,这会将第二个元素作为字符串而不是列表返回。
通常,最好在单独的行中处理每个步骤。错误检查是执行此操作的另一个原因。像Listening at 868 Mhz...
这样的行在第四个元素(=
)中没有Mhz...
。可能还有一些行甚至没有四个元素。任何一个都会导致IndexError
。
要解析一个浮点数,只需将最终的字符串结果包装到float
的调用中。
以下是使用相同调用提取数字字符串的更好方法:
elems = line.split()
if len(elems) > 3:
items = elems[3].split('=')
if len(items) > 1:
pressure = float(items[1])
这应该会告诉你为什么正则表达式是一个更清洁的选择。
答案 3 :(得分:1)
以下是两种非正则表达式解决方案。
第一个简单地使用(明显的)事实,即使用固定宽度字段呈现数据。在每个数据行中,BarC
的值从偏移44开始并在位置53之前结束。类似地sensorVal
从偏移63开始并在67之前结束。您可以使用字符串切片来提取这样的值:< / p>
line = "[99] nodeId=99 uptime=31987895 BarC=1.15 sensorVal=226 -"
if `BarC` in line: # test whether this is a data line
pressure = float(line[44:53])
sensor_val = int(line[63:67])
另一种方法是使用split()
来打破排队,然后查找包含=
的子字符串。然后将子字符串拆分为键/值对并创建字典:
data = {}
if 'BarC' in line:
for s in line.split():
if '=' in s:
key, value = s.split('=')
data[key] = value
print(data)
# {'BarC': '1.15', 'uptime': '31987895', 'nodeId': '99', 'sensorVal': '226'}
这可以简化为这个单行:
data = dict([s.split('=') for s in line.split() if 'BarC' in line and '=' in s])
print(data)
# {'BarC': '1.15', 'uptime': '31987895', 'nodeId': '99', 'sensorVal': '226'}
您可以根据需要使用float()
或int()
将值转换为所需的数据类型:
>>> float(data['BarC'])
1.15