我知道这里有很多关于"regex变量“的问题,但是似乎没有一个对我有用。我已经找了两个小时了,但没有找到具体的答案。
这是我的问题:我想搜索[ERROR]和[WARNING]的单词。您可能知道,/var/log/mysql/error.log有一个标准文件,基本上类似于这个year-month-day hour:minute。
示例:
2016-01-03 13:19:40 1242 [Warning] Buffered warning: Changed limits: table_open_cache: 431 (requested 2000)
2016-01-03 13:19:40 1242 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
2016-01-03 13:19:40 1242 [Note] Plugin 'FEDERATED' is disabled.我有一个脚本试图做这个工作:
#!/usr/bin/python
import re
import time
import datetime
from datetime import datetime
i = datetime.now()
dia = i.day
mes_abreviado = i.strftime('%b')
hora = i.strftime('%H')
minuto = i.strftime('%M')
ano = i.strftime('%Y')
mes_ano_num = i.strftime('%m')
dia_00 = i.strftime('%d')
#Data/Hora especifica "syslog"
date = '%s %d %s:%s'% (mes_abreviado, dia, hora, minuto)
#Data/Hora especifica do ficheiro "error.log"
mysql_time = '%s-%s-%s %s:%s'% (ano, mes_ano_num, dia_00, hora, minuto)
print mysql_time
words = '\b\[ERROR\]\b|\b\[WARNING\]\b'
print words
file = open("/var/log/mysql/error.log", "rb")
for line in file:
if re.findall(r'{0}'.format(words), line):
# if re.findall(r'{0}'.format(mysql_time), line):
# print "aqui"
print line
file.close()我必须得到当前的年,月,日,小时和分钟来搜索它的re.findall函数。问题是:我需要将它们放在一个变量中,并在正则表达式中使用它们,但它似乎不起作用。
这是输出:
2016-01-03 14:21
\[ERROR\\[WARNING\]如您所见,words不是在打印\b,而是在破坏正则表达式。我试过使用words = re.compile(words),words = re.compile(r'\b\[ERROR\]\b|\b\[WARNING\]\b')和re.findall(r'{0}'.format(words)。从表面上看,大梁是非常好的。
代码中有很多注释,这是我稍后要解决的问题。如果有什么遗漏,让我知道,这样我就可以编辑这个答案。提前谢谢你。
发布于 2016-01-03 15:28:24
我不知道您为什么在regexp中使用\b --当您要查找的单词已经由and分隔时,这是没有意义的。根据docs \b在at _的边缘匹配一个零长度字符串,所以您的模式可以匹配'aWARNINGb‘。另外,如果不通过向正则表达式中添加(?i)来确保正则表达式中的大小写不敏感,就无法在regexp中获得与日志文件中的警告相匹配的警告(如您提供的示例数据)。
将regex改为:words = r'(?i)\[ERROR\]|\[WARNING\]',它将开始工作。
一旦您完成了错误/警告匹配工作,就可以很容易地将日期字符串匹配添加到regexp中。
发布于 2016-01-03 15:27:30
不需要正则表达式,只需知道要检查的字段的位置(示例中的第四个字段):
lookfor = ('[Warning]', '[Error]')
with open('/var/log/mysql/error.log') as fh:
for line in fh:
parts = line.split(None, 5)
if len(parts) > 3 and parts[3] in lookfor:
print(line.rstrip())关于你的代码:
空格和方括号之间没有单词边界,因为这两个字符位于相同的字符类\W中。(单词边界在单词字符(\w)和非单词字符(\W)或字符串的限制之间。)
当只搜索字符串中的一个事件时,不需要使用re.findall。re.search更适合这个任务。
https://stackoverflow.com/questions/34577606
复制相似问题