python中re.findall和re.match的使用

电子说

1.3w人已加入

描述

小杜今天需要从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 osimport reimport 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 osimport reimport 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脚本中?有没有更便捷的实现方法?还需要继续学习、思考。


  审核编辑:汤梓红


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分