首页 > 解决方案 > 正则表达式向后匹配任何内容,直到第一次出现字符串

问题描述

我正在解析类似以下格式的日志文件以提取一些信息,因此我需要将 TO_BE_MATCHED 日志与之前的所有日志进行匹配,直到 Tick2,但不幸的是,尽管我将 (?) 设为非贪婪,但它仍扩展到第 1 行。

这里有什么建议吗?

import re
if __name__ == "__main__":

    text_str ='''0000 :TRACE|####### Tick1 #######   | file1.c:604
    0001 :TRACE|log1                     | file2.c:400
    0002 :TRACE|log2                     | file3.c:611
    0003 :TRACE|####### Tick2 #######    | file1.c:604
    0004 :TRACE|log3                     | file2.c:498
    0005 :TRACE|log4                     | file3.c:676
    0006 :TRACE|TO_BE_MATCHED            | file4.c:555
    0007 :TRACE|log5                     | file5.c:676
    0008 :TRACE|####### Tick3 #######    | file1.c:604"'''

    regex = r"(Tick(\d+)(.*?)TO_BE_MATCHED)"

    match = re.findall(regex,str(text_str), re.DOTALL)

    if(match):
        print match[0][0]

================================================

输出:

Tick1 #######   | file1.c:604
0001 :TRACE|log1                     | file2.c:400
0002 :TRACE|log2                     | file3.c:611
0003 :TRACE|####### Tick2 #######    | file1.c:604
0004 :TRACE|log3                     | file2.c:498
0005 :TRACE|log4                     | file3.c:676
0006 :TRACE|TO_BE_MATCHED

标签: pythonregex

解决方案


regex = r"(Tick2(.*?)TO_BE_MATCHED)"

如果您尝试匹配TO_BE_MATCHEDstring 和 TickN 之间的所有内容,其中 N 是大于 2 的任何数字;然后

regex = "r(Tick[2-9]{1,}(.*)TO_BE_MATCHED)"

推荐阅读