正则表达式向后匹配任何东西,直到第一次出现字符串

时间:2018-08-25 08:49:26

标签: python regex

我正在解析以下格式的日志文件以提取一些信息, 因此我需要将TO_BE_MATCHED日志与所有日志匹配,直到Tick2,但不幸的是,尽管我将(?)设为非贪婪的,它也扩展到了tick 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

2 个答案:

答案 0 :(得分:1)

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

,如果您要匹配TO_BE_MATCHED字符串和TickN之间的所有字符,其中N是大于2的任何数字;然后

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

答案 1 :(得分:0)

这将完成工作,它匹配Tick\dTO BE MATCHED之间的所有内容,而在两者之间没有Tick\d+

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+((?!Tick\d+).)*TO_BE_MATCHED)"

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

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