使用python正则表达式解析具有不同块中的值的特定单词
我试图使用Python正则表达式从3GB日志文件中提取数据作为元组 日志的格式如下所示使用python正则表达式解析具有不同块中的值的特定单词,python,regex,Python,Regex,我试图使用Python正则表达式从3GB日志文件中提取数据作为元组 日志的格式如下所示 2012-11-22 08:57:25,232 [P:DEBUG] moteId=245 statusElem=1 2012-11-22 08:57:25,042 [P:DEBUG] parsed into Tuple_IsSync(isSync=1) 2012-11-22 08:57:26,128 [P:DEBUG] parsed into Tuple_ScheduleRow(row=9, slotOffs
2012-11-22 08:57:25,232 [P:DEBUG] moteId=245 statusElem=1
2012-11-22 08:57:25,042 [P:DEBUG] parsed into Tuple_IsSync(isSync=1)
2012-11-22 08:57:26,128 [P:DEBUG] parsed into Tuple_ScheduleRow(row=9, slotOffset=9, type=6, shared=0, channelOffset=0, neighbor_type=0, neighbor_bodyH=0, neighbor_bodyL=0, backoffExponent=1, backoff=0, numRx=0, numTx=0, numTxACK=0, lastUsedAsn_4=0, lastUsedAsn_2_3=0, lastUsedAsn_0_1=0, next=7638)
我想要元组:
(2012-11-22, 08:57:25,042, moteId=245, statusElem=1, isSync=1, numRx=0, numTx=0, numTxACK=0,)
在一行中
import re
import sys
files=open('/Users/s/Desktop/p.log','r')
match=re.findall(r'\w[\s*moteId\s(statusElem)(isSync)(numTxAck).*]+.\d+',files.read())
f=open('/Users/s/Desktop/w.txt','w')
f.writelines(match)
f.close()
我的代码并没有准确地提取我要查找的内容。有什么建议吗?好吧,这不是正则表达式,只是标准的序列方法和切片,但至少对您提供的数据是有效的:
from StringIO import StringIO
data = '''
2012-11-22 08:57:25,232 [P:DEBUG] moteId=245 statusElem=1
2012-11-22 08:57:25,042 [P:DEBUG] parsed into Tuple_IsSync(isSync=1)
2012-11-22 08:57:26,128 [P:DEBUG] parsed into Tuple_ScheduleRow(row=9, slotOffset=9, type=6, shared=0, channelOffset=0, neighbor_type=0, neighbor_bodyH=0, neighbor_bodyL=0, backoffExponent=1, backoff=0, numRx=0, numTx=0, numTxACK=0, lastUsedAsn_4=0, lastUsedAsn_2_3=0, lastUsedAsn_0_1=0, next=7638)
'''
flo = StringIO(data)
mlst = []
for line in flo:
lst = line.split()
if 'moteId' in line:
mote, status = lst[3], lst[4]
elif 'isSync' in line:
dt, tm = lst[0], lst[1]
sync = lst[-1][-9:-1]
elif 'Tuple_ScheduleRow' in line:
numRx = lst[15].replace(',', '')
numTx = lst[16].replace(',', '')
numTxACK = lst[17].replace(',', '')
t = dt, tm, mote, status, sync, numRx, numTx, numTxACK
mlst.append(t)
我使用StringIO来模拟一个文件,您只需使用该文件即可。最后,我将元组存储在主列表中。但是,如果您在这样大小的文件上这样做,您可能会感到抱歉,这取决于您的内存情况。最好对元组执行任何需要执行的操作,然后让它成为gc'd。如果您必须使用正则表达式,那么您仍然可以使用此逻辑,并为每种线型应用不同的正则表达式,替换我的切片,等等
这当然不是优化的,但希望它会给你一些想法和一些使用
Mike好吧,这不是正则表达式,只是标准的序列方法和切片,但至少对您提供的数据是有效的:
from StringIO import StringIO
data = '''
2012-11-22 08:57:25,232 [P:DEBUG] moteId=245 statusElem=1
2012-11-22 08:57:25,042 [P:DEBUG] parsed into Tuple_IsSync(isSync=1)
2012-11-22 08:57:26,128 [P:DEBUG] parsed into Tuple_ScheduleRow(row=9, slotOffset=9, type=6, shared=0, channelOffset=0, neighbor_type=0, neighbor_bodyH=0, neighbor_bodyL=0, backoffExponent=1, backoff=0, numRx=0, numTx=0, numTxACK=0, lastUsedAsn_4=0, lastUsedAsn_2_3=0, lastUsedAsn_0_1=0, next=7638)
'''
flo = StringIO(data)
mlst = []
for line in flo:
lst = line.split()
if 'moteId' in line:
mote, status = lst[3], lst[4]
elif 'isSync' in line:
dt, tm = lst[0], lst[1]
sync = lst[-1][-9:-1]
elif 'Tuple_ScheduleRow' in line:
numRx = lst[15].replace(',', '')
numTx = lst[16].replace(',', '')
numTxACK = lst[17].replace(',', '')
t = dt, tm, mote, status, sync, numRx, numTx, numTxACK
mlst.append(t)
我使用StringIO来模拟一个文件,您只需使用该文件即可。最后,我将元组存储在主列表中。但是,如果您在这样大小的文件上这样做,您可能会感到抱歉,这取决于您的内存情况。最好对元组执行任何需要执行的操作,然后让它成为gc'd。如果您必须使用正则表达式,那么您仍然可以使用此逻辑,并为每种线型应用不同的正则表达式,替换我的切片,等等
这当然不是优化的,但希望它会给你一些想法和一些使用
Mike我不建议像那样读取整个文件,而是逐行迭代。事实上,你为什么不直接使用grep呢。用
逐行读取文件中的行:
并使用三个不同的regexp,每个都匹配一个行类型。是否有分隔符分隔这三行?或者该文件是由这三行组成的,它们之间没有分隔吗?Hello Colt45,日志文件(3GB)的生成与上述完全相同。没有分隔这三行的分隔符,只有不同行之间的空格。我不建议.read()
像这样遍历整个文件,而是逐行遍历。事实上,你为什么不直接使用grep呢。用逐行读取文件中的行:
并使用三个不同的regexp,每个都匹配一个行类型。是否有分隔符分隔这三行?或者该文件是由这三行组成的,它们之间没有分隔吗?Hello Colt45,日志文件(3GB)的生成与上述完全相同。没有分隔这三行的分隔符,只有不同行之间的空格。