Python正则表达式如何查找以给定单词开头并以两个单词中的任意一个结尾的子字符串

Python正则表达式如何查找以给定单词开头并以两个单词中的任意一个结尾的子字符串,python,regex,logging,Python,Regex,Logging,我正在解析一个日志文件,并试图找到一个子字符串,该子字符串以给定的模式(例如Start log)开始,以两个模式之一结束(例如exit code\d.或花费了\d*秒。),以较晚者为准 我尝试了以下方法,但没有成功: block_regex1=re.compile('Start log.*(退出代码\d.|花费\d*秒),re.DOTALL) block_regex2=re.compile('Start log.*?退出代码\d.| Start log.*?花费\d*秒。),re.DOTALL)

我正在解析一个日志文件,并试图找到一个子字符串,该子字符串以给定的模式(例如
Start log
)开始,以两个模式之一结束(例如
exit code\d.
花费了\d*秒。
),以较晚者为准

我尝试了以下方法,但没有成功:

block_regex1=re.compile('Start log.*(退出代码\d.|花费\d*秒),re.DOTALL)
block_regex2=re.compile('Start log.*?退出代码\d.| Start log.*?花费\d*秒。),re.DOTALL)
block_regex.findall(日志)
示例日志文件:

Start log 1
doing stuff
Finished with exit code 1.
Start log 2
doing stuff
Finished with exit code 0.
log 2 took 12 seconds.
Start log 3
doing stuff
Finished with exit code 0.
log 3 took 10 seconds.
Start log 4
doing stuff
Finished with exit code 1.
使用上述代码,它应输出一个包含以下内容的列表:

  • 开始日志1完成工作,退出代码为1。
  • 启动日志2完成工作,退出代码为0。日志2耗时12秒。
最后,我希望获得日志ID、退出代码,以及以秒为单位的时间。我想我可以通过小组的方式,继续研究它。

使用

Start log(?:(?!Start log.)*(?:退出代码\d+|花费\d*秒)\。
看。简言之:从
开始日志
退出代码
尽可能多地匹配文本需要xxx秒
,其间不允许
开始日志

解释

--------------------------------------------------------------------------------
启动日志“启动日志”
--------------------------------------------------------------------------------
(?:组,但不捕获(0次或更多次)
(匹配尽可能多的金额):
--------------------------------------------------------------------------------
(?!向前看,看看是否有:
--------------------------------------------------------------------------------
启动日志“启动日志”
--------------------------------------------------------------------------------
)展望的结束
--------------------------------------------------------------------------------
.除以下字符以外的任何字符\n
--------------------------------------------------------------------------------
)*分组结束
--------------------------------------------------------------------------------
(?:组,但不捕获:
--------------------------------------------------------------------------------
退出代码“退出代码”
--------------------------------------------------------------------------------
\d+数字(0-9)(1次或多次(匹配
尽可能多的钱)
--------------------------------------------------------------------------------
|或
--------------------------------------------------------------------------------
拿‘拿’
--------------------------------------------------------------------------------
\d*数字(0-9)(0或更多次(匹配
尽可能多的钱)
--------------------------------------------------------------------------------
秒“秒”
--------------------------------------------------------------------------------
)分组结束
--------------------------------------------------------------------------------
\.                       '.'

效果很好,解释也很棒,谢谢!您建议如何完成任务的第二部分(获取工作id、退出代码和时间安排)?@Pierre怎么样?看起来很好,谢谢!我还发现了一种直接使用正则表达式的方法,假设给定一个时间,我们知道退出代码是什么(#成功!),那么我们可以使用
finditer
组(n)