2013-09-26 88 views
0

我的示例日志文件很大,包含下面几行。Python正则表达式不匹配行

<6>[16495.700255] 

Memory - START UC1 

<4>16495.723327 C0 Memory - START UC1 

<4>[16495.723327] C0 [    sh] Memory - START UC1 

我找Memory - START UC1 下面的正则表达式得到前两行,但不是第三。

re.compile("(Memory - +(.*)$)") 
+2

请显示您使用正则表达式的完整代码。 –

+0

你想让正则表达式匹配整条线,你是用更像'grep'的东西来使用它,还是只对'Memory - START UC1'部分感兴趣? – AJMansfield

+0

此外,还有什么其他有效的可能性为'记忆 - 启动UC1'部分?它会永远只是那样吗,或者我可以像'Memory - STOP FK9'或'Memory - FOO BAR BAZ' ... – AJMansfield

回答

1

更改编译到:

re.compile("(.*?Memory - START UC1)") 

看看是否有帮助

这似乎对ideone

工作,如果你只是想获得这个词,请用正则表达式:

regex = compile(r'([^.* ]?Memory - START UC1)') 
+0

谢谢。有效。 – user2344495

2

使用re.MULTILINE作为re.compile的标志或将(?m)添加到正则表达式的开头。 $只匹配字符串的末尾,除非MULTILINE模式打开,当它匹配任何行的末尾时。

2

我将您的问题 - re.compile("(Memory - +(.*)$)")中的原始正则表达式复制到您的后续答案的代码中,并将其与您问题中的示例文本进行比对,并获得了所有三个匹配项。

@的re.compile("(.*?Memory - START UC1)") Smac89的建议是只需要如果要调用与event_regex.match(line)正则表达式,这是隐含固定字符串(^)的开始;如果你使用search(line)findall(line)那么.*?不会做任何事情,除非使正则表达式更难以阅读:它非贪婪地匹配零个或多个任何东西,所以如果你没有锚定到字符串的开始,那么它将结束无论如何,匹配零个字符。
而且我认为[^.* ]?的建议更加不合理,除非我非常错误(发生得太频繁)。这就是说:匹配零个或一个字符组成的字符组,其中包括所有字符,除了字面值.,字面值*或空格。再说一次,如果你不是固定在字符串的开始部分,那么正则表达式的这一部分无论如何都会最终匹配零字符。

老实说,如果你知道你想匹配确切的字符串Memory - START UC1,那么你可能会更好用一个简单的line.contains('Memory - START UC1'),而不是一个正则表达式。
但你最初的正则表达式包含+(这是'空间加') - 一个或多个空格 - 如果空格的数量可能会有所不同,那么是的,你确实需要一个正则表达式。在这种情况下,您可能还会考虑\s+,它与空格和制表符(以及其他一些更稀有的空格字符)都匹配。如果可能存在尾随空格,那么您应该在字符串末尾的锚点之前放置\s*。 (其实我怀疑,尾随空格是你最初的正则表达式不匹配目标字符串的三分之一发生的原因。)

一对夫妇的其他提示:
在您最初的正则表达式,"(Memory - +(.*)$)"你有两个捕获组(即),但我怀疑你实际上只需要一个,这取决于你只对“UC1”还是对“Memory - UC1”全部感兴趣。
此外,您的if not line:子句从不会触发,因为空白行仍然有换行符。你可以做line.strip() - 既然你已经做了line.strip()后来,我只想把一个line = line.strip()在循环的顶部,然后只用line其后,而不是重复的函数调用。这是一个很好的想法,但在这种情况下,我不确定它是否真的能为您节省任何东西,因为它不需要很长的时间就可以确定空白行上没有匹配。
最后的想法:它看起来像只在给定的行上最多只有一个匹配。如果是这种情况,请使用search(...)而不是findall(...)。没有必要继续寻找你找到你想要的东西。

正则表达式涉及到一点学习曲线,但是一旦你把它们训练出来,它们就会非常强大。坚持下去!