您好我正在尝试使用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天完全丢失了。
任何帮助非常感谢。
答案 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)
如果它是格式正确的日志文件(所有行看起来都一样)我不会用正则表达式复杂化它并使用普通拆分
def parse(s):
time, code_3_letter, message = s.split(None, 2)
# ...
答案 2 :(得分: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))
答案 3 :(得分:0)
更简单,更短的正则表达式:
[0-2][0-9](:[0-9]{2}){2} [A-z]{3} .*$
这匹配有效时间(基于您的输入格式),后跟空格,三个字母*,另一个空格,然后匹配所有内容直到行尾。这将允许'文本'要捕获的部分,即使它包含标点符号等。
* [A-z]将匹配小写字母,如果不需要使用[A-Z]而不是