Регулярные выражения соответствуют чему-либо задом наперед до первого появления строки

1

Я разбираю файл журнала, подобный приведенному ниже, чтобы извлечь некоторую информацию, поэтому мне нужно сопоставить журнал 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
  • 0
    Поставьте .* Перед тем, как потреблять и использовать группы для извлечения:. .*(Tick\d+.*?TO_BE_MATCHED)
Теги:

2 ответа

0
Лучший ответ

Этот будет выполнять эту работу, он соответствует всем 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]
  • 1
    Спасибо! это решило мою проблему, вы указали мне, как правильно использовать отрицательное прогнозное утверждение (?!)
1
regex = r"(Tick2(.*?)TO_BE_MATCHED)"

и если вы пытаетесь сопоставить все между TO_BE_MATCHED и TickN, где N - любое число, большее 2; затем

regex = "r(Tick[2-9]{1,}(.*)TO_BE_MATCHED)"
  • 0
    Ты это пробовал? Первый работает для Tick2 или Tick2315 но не для других значений.
  • 0
    На самом деле, мне нужно извлечь число (2), которое напоминает номер тика, где появилась строка TO_BE_MATCHED.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню