0

您好我正在尝试使用 RegEx 将日志文件拆分为稍后进入数据库的组。出于某种原因,我无法让最后一组包含字符串的最后一个单词和换行符。

我正在解析的日志文件如下所示:

12:00:01 GRP this is a test1
12:02:03 TES here something else has happend
12:32:22 MCH This processe is finished

我想把它们分成三组

Time
3-letter code
Text

目前在Python中我正在使用这个:

def parse (s):
    mO = re.search ('([0-9][0-9]:[0-9][0-9]:[0-9][0-9]) (\w*) (\w.+) ',s)
    if mO:
     print "1: "+mO.group(1)
     print "2: "+mO.group(2)
     print "3: "+mO.group(3)

我得到的结果是:

1: 12:00:01
2: GRP
3: this is a
1: 12:02:03
2: TES
3: here something else has
1: 12:32:22
2: MCH
3: This processe is

不断丢失新行附加到的字符串中的最后一个单词。我尝试在所有变体中添加 \n\r 但经过 1 天的搜索完全丢失。

非常感谢任何帮助。

4

4 回答 4

2

'(\w.+) '中, 急切地+捕获(())所有(.)个字符,直到找到最后一个空格。

   # Extra tail whitepace removed   
   mO = re.search ('([0-9][0-9]:[0-9][0-9]:[0-9][0-9]) (\w*) (\w.+)',s)
于 2013-01-03T10:16:14.437 回答
0

如果它是格式正确的日志文件(所有行看起来都一样),我不会使用正则表达式使其过于复杂并使用普通拆分

def parse(s):
  time, code_3_letter, message = s.split(None, 2)
  # ...

把事情简单化!

于 2013-01-03T10:18:58.850 回答
0

我在正则表达式和日志解析方面有很多经验。(这是我工作的一部分)

您想要做的不是使用正则表达式来搜索整个文件,而是要将文件的行输入到正则表达式中。这将为您提供更好的性能,而不是将整个文件放在内存中,一次只有 1 行。然后正则表达式也可以使用match,它比其他任何东西都快得多。我会这样做:

import re

def parse_logs(file_path):
    results = []
    regex = re.compile(r'(\d\d:\d\d:\d\d) (\S\S\S) (.+)')
    with open(file_path) as f:
        for line in f:
            ms = regex.match(line.strip())
            if not ms:
                continue
            results.append([ms.group(1), ms.group(2), ms.group(3)])
    return results

或者,为了更好的方法,把它变成一个生成器:

def parse_logs(file_path):
    regex = re.compile(r'(\d\d:\d\d:\d\d) (\S\S\S) (.+)')
    with open(file_path) as f:
        for line in f:
            ms = regex.match(line.strip())
            if not ms:
                continue
            yield (ms.group(1), ms.group(2), ms.group(3))
于 2013-01-03T10:21:04.760 回答
0

一个更简单、更短的正则表达式:

[0-2][0-9](:[0-9]{2}){2} [A-z]{3} .*$

这匹配一个有效时间(基于您的输入格式),后跟一个空格、三个字母*、另一个空格,然后匹配所有内容,直到行尾。这将允许捕获“文本”部分,即使它包含标点符号等。

* [Az] 将匹配小写字母,如果不希望使用 [AZ] 代替

于 2014-11-20T17:19:10.197 回答