首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >regex python变量

regex python变量
EN

Stack Overflow用户
提问于 2016-01-03 14:29:03
回答 2查看 119关注 0票数 0

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

这是我的问题:我想搜索[ERROR][WARNING]的单词。您可能知道,/var/log/mysql/error.log有一个标准文件,基本上类似于这个year-month-day hour:minute

示例:

代码语言:javascript
复制
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.

我有一个脚本试图做这个工作:

代码语言:javascript
复制
#!/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函数。问题是:我需要将它们放在一个变量中,并在正则表达式中使用它们,但它似乎不起作用。

这是输出:

代码语言:javascript
复制
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)。从表面上看,大梁是非常好的。

代码中有很多注释,这是我稍后要解决的问题。如果有什么遗漏,让我知道,这样我就可以编辑这个答案。提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-03 15:28:24

我不知道您为什么在regexp中使用\b --当您要查找的单词已经由and分隔时,这是没有意义的。根据docs \b在at _的边缘匹配一个零长度字符串,所以您的模式可以匹配'aWARNINGb‘。另外,如果不通过向正则表达式中添加(?i)来确保正则表达式中的大小写不敏感,就无法在regexp中获得与日志文件中的警告相匹配的警告(如您提供的示例数据)。

将regex改为:words = r'(?i)\[ERROR\]|\[WARNING\]',它将开始工作。

一旦您完成了错误/警告匹配工作,就可以很容易地将日期字符串匹配添加到regexp中。

票数 1
EN

Stack Overflow用户

发布于 2016-01-03 15:27:30

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34577606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档