我正在解析类似以下格式的日志文件以提取一些信息,
因此我需要将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
最佳答案
这将完成这项工作,它匹配Tick\d
和TO 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]
关于python - 正则表达式向后匹配任何东西,直到第一次出现字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52015536/