小杜今天需要從run.log中提取一些關(guān)鍵信息,又一次使用到了python的re.findall和re.match,也有了一點(diǎn)新的收獲。隨意寫一點(diǎn),當(dāng)作記錄。
我的具體使用場景是需要從數(shù)千行的run.log文件中提取出大括號 { } 中包住的數(shù)據(jù),數(shù)據(jù)有很多個,但格式都很固定,為 ‘hx 或 ‘hxx 的形式,每個數(shù)據(jù)由一個逗號和空格隔開,即:
{'hx, 'hx, 'hxx, 'hx, 'hxx, 'hxx, ...}
但大括號中的數(shù)據(jù)又只有部分固定位是我所需要的。
作為python腳本初學(xué)者,我目前的解決方法是先把大括號和其中的數(shù)據(jù)提取出來,再使用正則表達(dá)式的group將所需的固定位數(shù)據(jù)提取出來。
-
re.findall - 在字符串中找到正則表達(dá)式所匹配的所有子串,并返回一個列表,如果有多個匹配模式,則返回元組列表,如果沒有找到匹配的,則返回空列表。
-
re.match - 嘗試從字符串的起始位置匹配,如果模式在字符串中間,則不會匹配成功,match( ) 返回None。
這樣做的是因?yàn)檫@段數(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ù)的正則表達(dá)式
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 = '...' #帶有( )的正則表達(dá)式,匹配固定位數(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ù)運(yùn)行2次python腳本,再合理使用write( ),就可以提取出我需要的固定位數(shù)據(jù),并且以我需要的格式寫入到輸出的目標(biāo)文件中。
作為新手,寫的很簡易。能不能把這兩個步驟集成到一個python腳本中?有沒有更便捷的實(shí)現(xiàn)方法?還需要繼續(xù)學(xué)習(xí)、思考。
審核編輯:湯梓紅
-
python
+關(guān)注
關(guān)注
55文章
4767瀏覽量
84375 -
腳本
+關(guān)注
關(guān)注
1文章
387瀏覽量
14811
原文標(biāo)題:日常 - re.findall 和 re.match 的簡單使用
文章出處:【微信號:小杜的芯片驗(yàn)證日記,微信公眾號:小杜的芯片驗(yàn)證日記】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論