Я работаю над написанием парсера для извлечения информации из вывода, приведенного ниже.
мне нужно получить все три текста, которые находятся между '--'. поэтому я написал регулярное выражение, как показано ниже
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
но я получаю весь результат. где я ошибаюсь в своем понимании?
Ух ты. Это идеально работает. нужно немного разобраться в этом шаблоне. Я потрачу несколько дней и вернусь с конкретными вопросами, если таковые возникнут.
он просто разбивается на любые строки, содержащие два или более дефиса и необязательные символы новой строки. (?m)
— это сокращение от re.MULTILINE
, чтобы ^
и $
соответствовали началу/концу строки. [1:4]
отрезает первый предмет и дает вам необходимые три предмета.
Поскольку .
соответствует новой строке в режиме DOTALL
, первый .*
соответствует всему тексту между первой и последней строкой тире, а последняя строка тире соответствует последнему --+(.*)--+(.*)--+
, где два .*
соответствуют пустой строке.
Вместо этого вы можете использовать ^
в режиме MULTILINE
, чтобы утверждать, что каждая строка тире начинается в начале строки и сопровождается новой строкой:
re.search('^--+\n(.*)^--+\n(.*)^--+\n(.*)^--+\n', mystr, re.DOTALL | re.MULTILINE)
Демо здесь
Большое спасибо. это работает идеально. Спасибо большое и за подробное объяснение
Вы также можете разделить: re.split('(?m)\n?^--+$\n?', mystr)[1:4]