我将您问题中的原始正则表达式复制re.compile("(Memory - +(.*)$)")
到您后续答案中的代码中,然后针对您问题中的示例文本运行该代码,并获得所有三个匹配项。
@Smac89 的建议re.compile("(.*?Memory - START UC1)")
仅在您使用 调用正则表达式时才需要event_regex.match(line)
,它隐式锚定到字符串 ( ^
) 的开头;如果你使用search(line)
orfindall(line)
然后.*?
除了使正则表达式更难阅读之外什么都不做:它非贪婪地匹配零个或多个任何东西,所以如果你没有锚定到字符串的开头,那么它将最终匹配零反正字符。
而且我担心 的建议[^.* ]?
更没有意义,除非我大错特错(这种情况经常发生)。也就是说:匹配字符组中的零个或一个字符,该字符组由除文字外的所有字符组成.
,文字*
,或空格。同样,如果您没有锚定到字符串的开头,那么正则表达式的那部分最终很可能会匹配零个字符。
老实说,如果您知道要匹配确切的 string ,那么使用简单而不是正则表达式Memory - START UC1
可能会更好。
但是您的初始正则表达式包含(即“空格加号”)-一个或多个空格-如果空格的数量可以变化,那么是的,您确实需要一个正则表达式。在这种情况下,您也可以考虑匹配空格和制表符(以及其他一些罕见的空白字符)。如果有可能出现尾随空格,则应将其放在字符串结尾锚之前。(我实际上怀疑尾随空格是您的初始正则表达式与目标字符串的第三次出现不匹配的原因。) line.contains('Memory - START UC1')
+
\s+
\s*
$
其他一些提示:
在您的初始正则表达式中,"(Memory - +(.*)$)"
您有两个捕获组(即括号集),但我怀疑您实际上只想要一个,这取决于您是否只对“UC1”或所有“感兴趣”内存 - UC1"。
此外,您的if not line:
子句永远不会触发,因为空行仍然有换行符。你可以这样做line.strip()
- 因为你已经在line.strip()
稍后做了,所以我只需将 aline = line.strip()
放在循环的顶部,然后再使用line
,而不是重复函数调用。提早退出是个好主意,但在这种情况下,我不确定它是否真的可以为您节省任何东西,因为正则表达式引擎不需要很长时间就可以确定空行上没有匹配项。
最后的想法:看起来你最多只能在给定的行上期待一场比赛。如果是这种情况,请使用search(...)
而不是findall(...)
. 无需继续寻找您想要的东西。
正则表达式涉及一些学习曲线,但一旦你掌握它们,它们就会非常强大。坚持下去!