python使用正则表达式搜索文件和解析
我是python新手。我正试图编写一个快速而肮脏的python脚本来查找某些字符串日志文件,并从该行中提取某些信息。日志文件中的行如下所示python使用正则表达式搜索文件和解析,python,Python,我是python新手。我正试图编写一个快速而肮脏的python脚本来查找某些字符串日志文件,并从该行中提取某些信息。日志文件中的行如下所示 2012-08-01 13:36:40,449 [PDispatcher: ] ERROR Fatal error DEF_CON encountered. Shutting down 2012-08-01 14:17:10,749 [PDispatcher: ] INFO Package 1900034442 Queued for clearance.
2012-08-01 13:36:40,449 [PDispatcher: ] ERROR Fatal error DEF_CON encountered. Shutting down
2012-08-01 14:17:10,749 [PDispatcher: ] INFO Package 1900034442 Queued for clearance.
2012-08-01 14:23:06,998 [PDispatcher: ] ERROR Exception occurred attempting to lookup prod id 90000142
我有一个函数,其中输入参数将是一个文件名和一个要查找的模式数组。目前,我可以在文件中找到包含一个或多个指定模式的所有行(尽管不确定这是否是最有效的方法),并且我能够提取行号和行号
def searchLogs(fn, searchPatterns):
res = []
with open(fn) as f:
for lineNo, line in enumerate(f, 1):
#check if pattern strings exist in line
for sPattern in searchPatterns:
if sPattern in line:
fountItem = [fn, pattern, lineNo, line]
res.append(fountItem)
return res
searchLogs("c:\temp\app.log", ["ERROR", "DEF_CON"]) #this should return 3 elements based on the above log snipped (2 for the first line and 1 for the third line)
我想做的也是在搜索时提取日期和时间。因此,我考虑将搜索模式修改为带有分组的正则表达式字符串,用于搜索和提取日期。只有一个问题,我不知道如何在python中做到这一点…任何帮助都将不胜感激
编辑(解决方案):在Sebastian和Joel提供的链接的帮助下,我想出了这个解决方案:
def search_logs(fn, searchPatterns):
res = []
with open(fn) as f:
for lineNo, line in enumerate(f, 1):
#check if pattern strings exist in line
for sPattern in searchPatterns:
#crude reg ex to match pattern and if matched, 'group' timestamp
rex = r'^(.+) \[.*' + pattern
ms = re.match(rex, line)
if ms:
time = ms.group(1)
item = Structs.MatchedItem(fn, pattern, lineNo, line, time)
res.append(item)
return res
search_logs("c:\temp\app.log", ["ERROR", "DEF_CON"]) #this should return 3 elements based on the above log snipped (2 for the first line and 1 for the third line)
分为两部分:
- 提取日期时间字符串
- 将其解析为datetime对象
line.split(“[”,1)[0]
是一种快速但脆弱的解决方案。更健壮的解决方案是:
' '.join(line.split(None, 2)[:2])
但是它可能会慢一些。这是您的正则表达式。我已经测试了正则表达式,但没有测试完整的代码
def searchLogs(fn, searchPatterns):
res = []
with open(fn) as f:
for lineNo, line in enumerate(f, 1):
#check if pattern strings exist in line
for sPattern in searchPatterns:
if sPattern in line:
date = re.search(r'(19|20)\d{2}-(0[1-9]|[12])-(0[1-9]|[12][0-9]|3[01])',line).group()
time = re.search(r'\b([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]),[0-9][0-9][0-9]',line).group()
fountItem = (fn, pattern, lineNo, date, time, line) # prefer a tuple over list
res.append(fountItem)
return res
PS:REs总是在错误的地方让人痛苦。如果你需要解释,请告诉我。你应该改进你的问题,缺少一些研究的问题在stackoverflow中被认为是粗鲁的。我道歉……这是我写的第一段python代码,正如我所说的,这是一个针对短期sol的快速而肮脏的脚本注意监视。@Joel..谢谢…我认为这个链接确实有一些很好的例子会有所帮助me@mike01010:对于第一个python代码,它是一个非常好的代码。挑剔:使用,您可以使用
yield found\u item
而不是res.append(found\u item)
,同样found_item
应该是a。在查看lin提供的Joel时,我想我可能能够使用正则表达式在一行中进行搜索和“剥离”。我还没有完全弄清楚。但我想我可以生成一个包含日期/时间模式+(模式1 | patern2)的表达式,我应该能够匹配它,并且通过适当的分组,提取日期…我将尝试一点,如果没有,就采纳你的建议。@mike01010:这里没有必要使用正则表达式。strtime()
完成所有需要的验证。你可以使用我的第二个建议('.join(…)
)提取datetime部分:它始终适用于正确的datetime,其余部分由strTime()处理
。再次感谢塞巴斯蒂安。知道strtime的建议真的很好,而且很有帮助。感谢其他人,我能够根据之前的回复提出一个不太“安全”的解决方案。我编辑了我的原始帖子,以提供该解决方案。
def searchLogs(fn, searchPatterns):
res = []
with open(fn) as f:
for lineNo, line in enumerate(f, 1):
#check if pattern strings exist in line
for sPattern in searchPatterns:
if sPattern in line:
date = re.search(r'(19|20)\d{2}-(0[1-9]|[12])-(0[1-9]|[12][0-9]|3[01])',line).group()
time = re.search(r'\b([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]),[0-9][0-9][0-9]',line).group()
fountItem = (fn, pattern, lineNo, date, time, line) # prefer a tuple over list
res.append(fountItem)
return res