Регулярное выражение Python для получения текста в пределах определенного шаблона

Я работаю над написанием парсера для извлечения информации из вывода, приведенного ниже.

мне нужно получить все три текста, которые находятся между '--'. поэтому я написал регулярное выражение, как показано ниже

import re
def parse_ib_write_bw(mystr):
    output = dict()
    # match = re.search('--+\n(\n|.)*?--+', mystr, re.I)
    match = re.search('--+\n(.*)--+(.*)--+(.*)--+', mystr, re.DOTALL)

    if match:
        print(match.groups(1))
        print(match.groups(2))
        print(match.groups(3))

parse_ib_write_bw(my_str)

Мое понимание:

--+\n(.*)--+    -->  This would give the output of the first block  until second  '---' is found

(.*)--+ --> would give the second block until the third '--' is found 

(.*)--+ --> would give the third block until the final'--' is found 

но я получаю весь результат. где я ошибаюсь в своем понимании?


3
57
1

Ответ:

Решено

Поскольку . соответствует новой строке в режиме DOTALL, первый .* соответствует всему тексту между первой и последней строкой тире, а последняя строка тире соответствует последнему --+(.*)--+(.*)--+, где два .* соответствуют пустой строке.

Вместо этого вы можете использовать ^ в режиме MULTILINE, чтобы утверждать, что каждая строка тире начинается в начале строки и сопровождается новой строкой:

re.search('^--+\n(.*)^--+\n(.*)^--+\n(.*)^--+\n', mystr, re.DOTALL | re.MULTILINE)

Демо здесь