正则表达式python变量

时间:2016-01-03 14:29:03

标签: python regex

我知道这里有很多关于" regex python变量的问题"但似乎没有一个对我有用。我一直在寻找两个小时,但我没有找到具体问题的答案。

以下是我的问题:我想搜索[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)。从它的外观来看,正则表达式非常好。

代码中有很多注释,这些问题我将在后面解决。如果有什么遗失让我知道,所以我可以编辑这个答案。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您不需要正则表达式,您只需要知道要检查的字段的位置(示例中的第4个字段):

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.findallre.search更适合此任务。

答案 1 :(得分:1)

我不知道为什么你在你的正则表达式中使用\ b - 当你正在寻找的单词已经被[和]分隔时,这没有意义。根据文档\ b匹配a-zA-Z_边缘的零长度字符串,因此您的模式可以匹配'a [WARNING] b'。另外,我无法在正则表达式中获得[警告]以匹配日志文件中的[警告](如您提供的示例数据),而不通过向(?i)添加(?i)来确保正则表达式中的大小写不敏感。

将正则表达式更改为:words = r'(?i)\[ERROR\]|\[WARNING\]',它应该开始工作。

一旦错误/警告匹配正常,您可以很容易地将日期字符串匹配添加到正则表达式中。