小杜今天需要從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腳本中?有沒有更便捷的實現方法?還需要繼續學習、思考。
審核編輯:湯梓紅
-
python
+關注
關注
56文章
4782瀏覽量
84453 -
腳本
+關注
關注
1文章
387瀏覽量
14831
原文標題:日常 - re.findall 和 re.match 的簡單使用
文章出處:【微信號:小杜的芯片驗證日記,微信公眾號:小杜的芯片驗證日記】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論