<p>这看起来像是正则表达式的工作!事实上有好几个。谢天谢地,在这种情况下使用它们并不复杂。你知道吗</p>
<p>有两个主要的观察结果会让我选择正则表达式而不是其他东西:</p>
<ol>
<li>需要从两个已知常量值之间提取一位变量文本</li>
<li>对于不同的字符串,需要多次遵循相同的模式</li>
</ol>
<p>您可以尝试以下方法:</p>
<pre><code>import re
def capture(text, pattern_string, flags=0):
pattern = re.compile(pattern_string, flags)
match = pattern.search(text)
if match:
output = match.group(1)
print '{}\n'.format(output)
return output
return ''
if __name__ == '__main__':
file = read_my_file()
log_pattern = "\*\*==== START ====\*\*(.+)\*\*==== END ====\*\*"
log_text = capture(file, log_pattern, flags=re.MULTILINE|re.DOTALL)
op_pattern = " operation\(\): (.+). StartOperation\*\*\*\*\*"
op_name = capture(log_text, op_pattern)
poid_pattern = "poid: \*\*([\d]+)\*\*, poidLen: "
op_name = capture(log_text, poid_pattern)
retcode_pattern = "Unknown error code \*\*\((.+)\)\*\*.+\*\*Roll back\*\* all updates!"
retcode = capture(log_text, retcode_pattern, flags=re.MULTILINE|re.DOTALL)
</code></pre>
<p>这种方法本质上把问题分成几个基本上独立的步骤。我在每个正则表达式中使用捕获组,比如<code>(.+)</code>和<code>([\d]+)</code>,在常量字符的长字符串之间。多行和dotall标志允许您轻松地处理文本中的换行符,并像处理字符串的任何其他部分一样处理它们。你知道吗</p>
<p><strong>我在这里还做了一个很大的假设,即您的日志不是大文件,可能最多只有几百兆字节。</strong>注意对<code>read_my_file()</code>的调用-我选择读取整个文件并在内存中工作,而不是一次一行解决这个问题。如果文件变得非常大,或者你正在构建一个会获得大量流量的应用程序,这可能是个坏主意。你知道吗</p>
<p>希望这有帮助!你知道吗</p>