在日志文件中,我在每一行都有以下格式:
[date] [thread] [loglevel] [class] some text describing the event that happened.
我想遍历日志并拆分字符串,以便我有以下内容: [' date',' thread',' loglevel',' class','一些文字描述发生的事件。& #39]
我很确定我需要使用re.split来执行此操作,但我的正则表达式很糟糕。
尝试这样的事情:
for line in open(sys.argv[1]).xreadlines():
parts = re.split(r'[[]]',line)
感谢任何帮助!
答案 0 :(得分:3)
试试这个:
>>> log = '[date] [thread] [loglevel] [class] some text describing the event that happened.'
>>> [part.strip() for part in re.split('[\[\]]', log) if part.strip()]
['date', 'thread', 'loglevel', 'class', 'some text describing the event that happened.']
当字符串看到[或]时会被拆分。在re.split的模式中,您需要转义这些字符。我添加了part.strip()和part.strip()以删除不需要的空格和空字符串
答案 1 :(得分:1)
首先,\[(.*?)\]
将匹配括号中的任何内容。
所以,如果你想这样做四次:
r = r'\[(.*?)\].*?' * 4
date, thread, loglevel, class = re.match(r, log).groups()
而且,为了得到余数:
r = r'\[(.*?)\].*?' * 4 + r'(.*)'
date, thread, loglevel, class, text = re.match(r, log).groups()
或者,如果您愿意明确地写出来:
r = r'\[(.*?)\].*?\[(.*?)\].*?\[(.*?)\].*?\[(.*?)\].*?(.*)'
......但就个人而言,我发现这种方式令我感到头疼。
但如果您在使用正则表达式时遇到困难,那么简化操作可能会更容易。例如......
首先,找到括号之间的所有内容:
date, thread, loglevel, class = re.findall(r'\[(.+?)\]', log)
然后找到最后一个括号后的所有内容:
text = log.rpartition(']')[-1].lstrip()
它显然比单一的正则表达式解决方案更冗长,并且它可能也会更慢,但如果您能够理解并自己维护它,那么它的价值会更高从长远来看。
答案 2 :(得分:0)
您可以尝试匹配字符串而不是拆分字符串。
>>> import re
>>> s = "[date] [thread] [loglevel] [class] some text describing the event that happened."
>>> m = re.findall(r'(?<=\[)[^]]*|(?<=]\s)[^\]\[]+', s)
>>> m
['date', 'thread', 'loglevel', 'class', 'some text describing the event that happened.']
答案 3 :(得分:0)