使用Python解析字符串并拉出数字以进行简单的数学运算

时间:2017-11-16 02:55:50

标签: python string parsing

我正在运行" 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'] (撇号)和' '并将其变成我可以用简单数学运算的东西。浮动数字可以。

以下是更多输出:

[  ]

4 个答案:

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