欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python从字符串中提取指定内容

程序员文章站 2024-03-05 11:33:12
...

前言

我们在做数据处理的时候,会遇到包含多条格式类似的长字符串,比如说

recv = 'Node1_temperature:26 Node1_humidity:48 Node2_temperature:36 Node2_humidity:48 ' \
        'Node3_temperature:24 Node3_humidity:35 Node4_temperature:54 Node4_humidity:48 ' \
       'Node5_temperature:43 Node5_humidity:48 '

从字符串中我们可以看到有五组格式相同的数据,每一组包含temperature和humidity,所以该怎么把这5组数据提取出来呢?

一.使用pre包中的findall方法

例如:提取Node1_temperature的值,我们可以这样做

Node1_temperature = re.findall(r'Node1_temperature:(.*) Node1_humidity', recv)

该例提出的数据是26。从例子可以看出,findall方法的使用: re.findall(r’ 26前面的部分内容(.*)26后面的部分内容’),也即指明前后,来确定中间夹着的内容,指明相对位置得到绝对位置。

二.findall方法的数据返回类型

findall方法返回的数据类型是一个列表,其列表的内容有且只有一个并且是字符串类型的数据,因此可以定义一个变量来接收,该变量接收后成为列表并且只有一个字符串类型的数据。或者另外定义一个列表,先用索引的方式得到该数据,因为只有一个数据,所以索引最大为0:Node1_temperature[0],最后再使用append方法将数据添加到定义好的列表内。如下:

temp = []
Node1_temperature = re.findall(r'Node1_temperature:(.*) Node1_humidity', recv)
temp.append(int(Node1_temperature[0]))

三.说明

格式要求:修改单引号内的内容即可,(.)不用更改。(.)前后的内容根据要提取的数据而定,并且要注意的原字符串中某一数据如26的前后如果包含空格,(.*)前后的内容也要包括空格

re.findall(r'Node1_temperature:(.*) Node1_humidity', recv)

四.Demo

import re
temp = []
humidity = []
recv = 'Node1_temperature:26 Node1_humidity:48 Node2_temperature:36 Node2_humidity:48 ' \
        'Node3_temperature:24 Node3_humidity:35 Node4_temperature:54 Node4_humidity:48 ' \
       'Node5_temperature:43 Node5_humidity:48 '
Node1_temperature = re.findall(r'Node1_temperature:(.*) Node1_humidity', recv)
temp.append(int(Node1_temperature[0]))
Node1_humidity = re.findall(r'Node1_humidity:(.*) Node2_temperature', recv)
humidity.append(int(Node1_humidity[0]))
Node2_temperature = re.findall(r'Node2_temperature:(.*) Node2_humidity', recv)
temp.append(int(Node2_temperature[0]))
Node2_humidity = re.findall(r'Node2_humidity:(.*) Node3_temperature', recv)
humidity.append(int(Node2_humidity[0]))
Node3_temperature = re.findall(r'Node3_temperature:(.*) Node3_humidity', recv)
temp.append(int(Node3_temperature[0]))
Node3_humidity = re.findall(r'Node3_humidity:(.*) Node4_temperature', recv)
humidity.append(int(Node3_humidity[0]))
Node4_temperature = re.findall(r'Node4_temperature:(.*) Node4_humidity', recv)
temp.append(int(Node4_temperature[0]))
Node4_humidity = re.findall(r'Node4_humidity:(.*) Node5_temperature', recv)
humidity.append(int(Node4_humidity[0]))
Node5_temperature = re.findall(r'Node5_temperature:(.*) Node5_humidity', recv)
temp.append(int(Node5_temperature[0]))
Node5_humidity = re.findall(r'Node5_humidity:(.*) ', recv)
humidity.append(int(Node5_humidity[0]))
print("5个结点的温度分别为:")
print(temp)
print("5个结点的湿度分别为:")
print(humidity)



五.代码看起来有非常大的改进空间,我相信一定有很好的可以实现相同该类功能的算法,在此请路过的大佬留下建议,谢谢了^ _ ^