Я работаю над написанием парсера для извлечения информации из вывода, приведенного ниже.
мне нужно получить все три текста, которые находятся между '--'. поэтому я написал регулярное выражение, как показано ниже
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
но я получаю весь результат. где я ошибаюсь в своем понимании?
Поскольку .
соответствует новой строке в режиме DOTALL
, первый .*
соответствует всему тексту между первой и последней строкой тире, а последняя строка тире соответствует последнему --+(.*)--+(.*)--+
, где два .*
соответствуют пустой строке.
Вместо этого вы можете использовать ^
в режиме MULTILINE
, чтобы утверждать, что каждая строка тире начинается в начале строки и сопровождается новой строкой:
re.search('^--+\n(.*)^--+\n(.*)^--+\n(.*)^--+\n', mystr, re.DOTALL | re.MULTILINE)
Демо здесь