本篇是我在公司给同事培训的内容,大致内容都会写出来,但是,写文总是没有在现场说的那么多,所以,则重编写。
前言
本篇意在使得同事学会基本是正则表达式,因为后续可能会需要给定框架后,自己编写正则表达式。所以本篇是理论+实战。
数据源(内部日志数据,截取一部分讲):
... [13:52:44]<batterry> [13:52:44]vol : 10327 mv [13:52:44]cur : 4344 ma [13:52:44]cap : 25 % [13:52:44]tpwr : 44.86 w [13:52:44]<motor> ...
需求
我有N个这样的数据源,我只需要与之间的的cap对应的25。
在这个需求之前,为了不那么抽象化,在之后还有很多其他的数据例如,在之前还有很多其他数据,例如也就是说,正确的数据源其中的片段应该是:
[13:52:44]<fruits> [13:52:44]apple : 11111 mv [13:52:44]banana : 22222 mv [13:52:44]vol : 10327 mv [13:52:44]<batterry> [13:52:44]vol : 10327 mv [13:52:44]cur : 4344 ma [13:52:44]cap : 25 % [13:52:44]tpwr : 44.86 w [13:52:44]<motor> [13:52:44]bird : 999999 w [13:52:44]monkey : 888888 [13:52:44]tpwr : 44.86 w [13:52:44]<animals>
但是真正的数据源是有N多个这样的片段组成,我需要拿到我需要的数据。怎么做?
思路
首先,我需要用什么库,这里默认re正则表达式。那么我怎么匹配?
1、标志位,也就是我需要告诉正则表达式,我从什么地方开始
2、结束位,也就是告诉正则表达式,我需要在什么位置结束。
3、表达式,怎么写,能保证我的正则的健壮性,以及准确性。
在这之前,肯定是先要可以将数据拿出来。
操作
首先我先将做为开始结束,进行匹配,然后将得到的结果再次处理,拿到cap的对应的值。
第一步
import re values = """ [13:52:44]<fruits> [13:52:44]apple : 11111 mv [13:52:44]banana : 22222 mv [13:52:44]vol : 10327 mv [13:52:44]<batterry> [13:52:44]vol : 10327 mv [13:52:44]cur : 4344 ma [13:52:44]cap : 25 % [13:52:44]tpwr : 44.86 w [13:52:44]<motor> [13:52:44]bird : 999999 w [13:52:44]monkey : 888888 [13:52:44]tpwr : 44.86 w [13:52:44]<animals> """ data = re.findall("<batterry>(.*)<motor>", values, re.S)
第二步
知道自己需要匹配的数据有哪些后,就需要写对应的正则了,也需要分析一下匹配策略。
"\s" 匹配空白字符
"\d" 匹配数字字符
"." 匹配任意字符
"*" 匹配0个活多个字符
"" 转义,匹配特殊字符
"()" 将所需要的数据单独匹配出来
for key in data: volValue = re.findall("\[(.*)\]({})\s*:\s*(\d*)".format("cap"), key)
这里就已经将值都拿出来了,接下来就是为后续做准备,写入CSV还是excel还是做图。都需要组合数据。
第三步
我写的是字典嵌套列表,所以,直接看代码:
volDict = {} timeList = [] valueList = [] for value in volValue: timeList.append(value[0]) valueList.append(value[2]) volDict["time"] = timeList volDict["vol"] = volValue[0][1] volDict["value"] = valueList print(volDict)
这样就能拿到对应的数据了,这里还匹配了时间戳,这是必不可少的环节。
本章就到这了,期待后续~