如何使用正则表达式拆分单行合并打印的多条程序日志?
解决方案
你可以通过正向预查匹配日志边界的方式调整正则,核心逻辑是:每条日志以固定格式的时间戳开头,结束位置为下一个时间戳的起始位置(或整个字符串末尾)。
调整后的代码示例
import re string = "2021-08-04:12.55.51.965438904: bla bla bla bla2021-08-04:12.55.51.965493516: bla bla bla bla2021-08-04:12.55.52.073093436: bla bla bla bla" # 正则说明: # \d{4}-\d{2}-\d{2}:\d{2}\.\d{2}\.\d{2}\.\d+ 匹配固定格式的时间戳,注意转义点号避免匹配任意字符 # : .*? 匹配时间戳后的冒号、空格,以及后续的日志内容(非贪婪模式防止过度匹配) # (?=\d{4}-\d{2}-\d{2}:|$) 正向预查,断言下一个位置是新的时间戳开头,或者字符串结束 reg_exp = re.compile(r"\d{4}-\d{2}-\d{2}:\d{2}\.\d{2}\.\d{2}\.\d+:.*?(?=\d{4}-\d{2}-\d{2}:|$)", re.DOTALL) for match in reg_exp.finditer(string): print(match.group())
输出结果
2021-08-04:12.55.51.965438904: bla bla bla bla 2021-08-04:12.55.51.965493516: bla bla bla bla 2021-08-04:12.55.52.073093436: bla bla bla bla
补充说明
- 原代码的正则仅匹配了时间戳部分,没有覆盖后续日志内容,也没有处理多条日志的边界问题,所以只能单独提取时间戳
- 正则中加了
re.DOTALL标记是为了适配日志内容中存在换行符的场景,如果你的日志内容绝对不会出现换行,可以去掉该标记 - 时间戳的匹配用了固定位数的年、月、日、时、分、秒前缀,比通用
\d+匹配精度更高,不会误判内容里的数字串为时间戳
内容的提问来源于stack exchange,提问作者ManiAm
相关产品推荐
相关产品推荐

