Я разбираю файл журнала, подобный приведенному ниже, чтобы извлечь некоторую информацию, поэтому мне нужно сопоставить журнал 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
Этот будет выполнять эту работу, он соответствует всем Tick\d+
между Tick\d+
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]
regex = r"(Tick2(.*?)TO_BE_MATCHED)"
и если вы пытаетесь сопоставить все между TO_BE_MATCHED
и TickN, где N - любое число, большее 2; затем
regex = "r(Tick[2-9]{1,}(.*)TO_BE_MATCHED)"
Tick2
или Tick2315
но не для других значений.
.*
Перед тем, как потреблять и использовать группы для извлечения:..*(Tick\d+.*?TO_BE_MATCHED)