RegEx包括换行符的最后一个单词

时间:2013-01-03 10:11:31

标签: python regex

您好我正在尝试使用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 \ n但是在搜索完毕后1天完全丢失了。

任何帮助非常感谢。

4 个答案:

答案 0 :(得分:2)

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

   # Extra tail whitepace removed   
   mO = re.search ('([0-9][0-9]:[0-9][0-9]:[0-9][0-9]) (\w*) (\w.+)',s)

答案 1 :(得分:0)

更简单,更短的正则表达式:

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

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

* [A-z]将匹配小写字母,如果不需要使用[A-Z]而不是

答案 2 :(得分:0)

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

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

Keep it simple!

答案 3 :(得分: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))