小杜今天需要從run.log中提取一些關鍵信息,又一次使用到了python的re.findall和re.match,也有了一點新的收獲。隨意寫一點,當作記錄。
我的具體使用場景是需要從數(shù)千行的run.log文件中提取出大括號 { } 中包住的數(shù)據(jù),數(shù)據(jù)有很多個,但格式都很固定,為 ‘hx 或 ‘hxx 的形式,每個數(shù)據(jù)由一個逗號和空格隔開,即:
{'hx, 'hx, 'hxx, 'hx, 'hxx, 'hxx, ...}
但大括號中的數(shù)據(jù)又只有部分固定位是我所需要的。
作為python腳本初學者,我目前的解決方法是先把大括號和其中的數(shù)據(jù)提取出來,再使用正則表達式的group將所需的固定位數(shù)據(jù)提取出來。
-
re.findall - 在字符串中找到正則表達式所匹配的所有子串,并返回一個列表,如果有多個匹配模式,則返回元組列表,如果沒有找到匹配的,則返回空列表。
-
re.match - 嘗試從字符串的起始位置匹配,如果模式在字符串中間,則不會匹配成功,match( ) 返回None。
這樣做的是因為這段數(shù)據(jù)并不在行首,且數(shù)據(jù)前面有一長串的打印信息,并不方便直接使用re.match,因此先使用re.findall將所有符合該pattern的數(shù)據(jù)提取出來,再使用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 = '...' #匹配大括號和數(shù)據(jù)的正則表達式
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 = '...' #帶有( )的正則表達式,匹配固定位數(shù)據(jù)
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()
這樣通過連續(xù)運行2次python腳本,再合理使用write( ),就可以提取出我需要的固定位數(shù)據(jù),并且以我需要的格式寫入到輸出的目標文件中。
作為新手,寫的很簡易。能不能把這兩個步驟集成到一個python腳本中?有沒有更便捷的實現(xiàn)方法?還需要繼續(xù)學習、思考。
審核編輯:湯梓紅
-
python
+關注
關注
56文章
4827瀏覽量
86794 -
腳本
+關注
關注
1文章
398瀏覽量
28474
原文標題:日常 - re.findall 和 re.match 的簡單使用
文章出處:【微信號:小杜的芯片驗證日記,微信公眾號:小杜的芯片驗證日記】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
python實現(xiàn)網(wǎng)頁爬蟲爬取圖片
Python面試必看的10個問題
利用Python實現(xiàn)簡單圖片下載功能
初識 Python 正則表達式
python正則表達式字符集
python正則表達式數(shù)量詞
python正則表達式中的常用函數(shù)
python中urllib3和requests的使用
RE46C114 RE46C114是一種電離煙霧探測器AFE
RE46C112 RE46C112是一種電離煙霧探測器AFE
帖子主題:Re:Колибрипрограммированияпрограммирования

評論