电子说
小杜今天需要从run.log中提取一些关键信息,又一次使用到了python的re.findall和re.match,也有了一点新的收获。随意写一点,当作记录。
我的具体使用场景是需要从数千行的run.log文件中提取出大括号 { } 中包住的数据,数据有很多个,但格式都很固定,为 ‘hx 或 ‘hxx 的形式,每个数据由一个逗号和空格隔开,即:
{'hx, 'hx, 'hxx, 'hx, 'hxx, 'hxx, ...}
但大括号中的数据又只有部分固定位是我所需要的。
作为python脚本初学者,我目前的解决方法是先把大括号和其中的数据提取出来,再使用正则表达式的group将所需的固定位数据提取出来。
re.findall - 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
re.match - 尝试从字符串的起始位置匹配,如果模式在字符串中间,则不会匹配成功,match( ) 返回None。
这样做的是因为这段数据并不在行首,且数据前面有一长串的打印信息,并不方便直接使用re.match,因此先使用re.findall将所有符合该pattern的数据提取出来,再使用re.match配合group提取固定位信息就方便许多(正则好写很多)。下面是我的两段python脚本:
import os
import re
import string
file_input = 'path/run.log'
file_output = 'path/xxx1.dat'
fi = open(file_input, 'r')
fo = open(file_output, 'w')
pattern = '...' #匹配大括号和数据的正则表达式
for line in f1.readlines():
data = re.findall(pattern, line)
fo.write(data)
fo.write(' ')
fi.close()
fo.close()
import os
import re
import string
file_input = 'path/xxx1.dat'
file_output = 'path/xxx2.dat'
fi = open(file_input, 'r')
fo = open(file_output, 'w')
pattern = '...' #带有( )的正则表达式,匹配固定位数据
for line in f1.readlines():
data1 = re.match(pattern, line).group(1)
data2 = re.match(pattern, line).group(3)
data3 = re.match(pattern, line).group(5)
fo.write(data1)
fo.write(data2)
fo.write(data3)
fo.write(' ')
fi.close()
fo.close()
这样通过连续运行2次python脚本,再合理使用write( ),就可以提取出我需要的固定位数据,并且以我需要的格式写入到输出的目标文件中。
作为新手,写的很简易。能不能把这两个步骤集成到一个python脚本中?有没有更便捷的实现方法?还需要继续学习、思考。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !