<p>无需尝试将整个字符串与regex匹配,您只需匹配日期并使用它将字符串分隔到所需的日志中:</p>
<pre><code>import re
sample="""2018-03-06 11:36:40:048 INFO:Starting. (com.X.s.f.o.o)
2018-03-06 11:36:42:931 SEVERE: Error attempting to s: StatusRuntimeException (com.Y.W.Z_H.ZHGC.sHToVe)
io.G.StatusRuntimeException: EXCEEDED
at io.G.stub.CCalls.toStatusRuntimeException(CCalls.java:227)
at io.G.stub.CCalls.getUnchecked(CCalls.java:208)
at io.G.stub.CCalls.blockingUnaryCall(CCalls.java:141)
2018-03-06 11:36:46:159 SEVERE: Error attempt: StatusRuntimeException (com.Y.W.Z_H.ZHGC.sHToVe)
io.G.StatusRuntimeException: EXCEEDED
at io.G.stub.CCalls.toStatusRuntimeException(CCalls.java:227)
at io.G.stub.CCalls.getUnchecked(CCalls.java:208)
at io.G.stub.CCalls.blockingUnaryCall(CCalls.java:141)
2018-03-06 11:36:46:824 SEVERE: getConfigInteger(): eGSWindowsPortNumber (com.Y.W.Y_Z_config_s.YZConfigs.getInteger)
2018-03-06 11:36:46:844 SEVERE: Failed to get (com.Y.W.Z_H.ZHGC.create)"""
def date_match(s):
"""Returns true if the beginning of this string matches a date and time."""
return bool(re.match("\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}", s))
def yeild_matches(full_log):
log = []
for line in full_log.split("\n"):
if date_match(line): # if this line starts with a date
if len(log) > 0: # if theres already a log...
yield "\n".join(log) # ... yield the log ...
log = [] # ... and set the log back to nothing.
log.append(line) # add the current line to log (list)
yield "\n".join(log) # return the last log (theres no date at the end of the string to end the last log)
logs = list(yeild_matches(sample))
for i, l in enumerate(logs):
print("Match {}:\n{}\n".format(i + 1, l))
</code></pre>
<p><code>yield_matches</code>将把每一行添加到名为<code>log</code>的列表中,直到找到另一个日期。当它找到日期时,<a href="https://stackoverflow.com/q/231767/9348376">^{<cd3>}</a>是当前日志,并将日志设置为空。在</p>
<p>输出如下:</p>
^{pr2}$