Python正则表达式不匹配行

时间:2013-09-26 19:41:16

标签: python regex

我的示例日志文件很大,包含以下行。

<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 - +(.*)$)")

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

只有当你使用re.compile("(.*?Memory - START UC1)")调用正则表达式时,才需要@pcc89对event_regex.match(line)的建议,^隐含地锚定在字符串的开头(search(line));如果您使用findall(line).*?,则[^.* ]?除了使正则表达式更难阅读之外不会做任何事情:它非贪婪地匹配零或更多的任何东西,所以如果你是没有锚定到字符串的开头那么它最终会匹配零字符。
而且我担心.的建议更没意义,除非我非常错误(这种情况经常发生)。这就是说:匹配包含所有字符的字符组中的零个或一个字符,除了文字*,文字Memory - START UC1或空格。再次,如果你没有锚定到字符串的开头,那么正则表达式的那部分最终很可能与零字符匹配。

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

其他一些提示:
在你的初始正则表达式if not line:中,你有两个捕获组(即括号组),但我怀疑你实际上只想要一个,这取决于你是否只对“UC1”或所有“内存”感兴趣 - UC1“。
此外,您的line.strip()子句永远不会触发,因为空行仍然有换行符。您可以执行line.strip() - 因为您之后已经line = line.strip()了,我只需将line放在循环的顶部,然后再使用search(...),而不是重复函数调用。提前考虑这是一个很好的想法,但在这种情况下,我不确定它是否真的可以为您节省任何东西,因为它不需要正则表达式引擎很长时间才能发现空行上没有匹配。
最后的想法:看起来你只想到给定线上最多一场比赛。如果是这种情况,请使用findall(...)而不是{{1}}。没有必要继续照顾你找到你想要的东西。

正则表达式涉及一些学习曲线,但是一旦你理解它们,它们就会非常强大。坚持下去!

答案 2 :(得分:1)

将编译更改为:

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

看看是否有帮助

它似乎适用于ideone

如果您只想获得这个词,请将正则表达式替换为:

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