input = """
endless gibberish
some more stuff
color texture mytexture
[640 480 1]
'BE4C16FFBD4B15FFBD4B15FFBD4B15FFBD4B15FFBE4C16FFBE4C16FFBD4B15FFBD4B15FF'
'BE4C16FFBE4C16FFBD4B15FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBE4C16FF'
'BF4C16FFBF4C16FFBE4B15FFBE4B15FFBC4913FFBC4913FFBC4913FFBB4812FFBC4913FF'
'BC4A14FFBB4913FFBB4812FFBB4812FFBA4812FFBA4812FFBB4913FFBC4A16FFBB4915FF'
'B84612FFB84612FFB94713FFB84612FFB64410FFB64410FFB64410FFB4420EFFB3410DFF'
'FB03E0AFFB13F0BFB13F0BFFAE3C08FFAA3804FFAD3B07FFB03E0AFFB3410DFFB4420EFF'
'B4400DFFB13D0AFFB23C0AFFB03C09FFB23E0BFFB5410EFFB74310FFB94512FFB84411FF'
color texture mytexture2
[640 480 1]
'BE4C16FFBD4B15FFBD4B15FFBD4B15FFBD4B15FFBE4C16FFBE4C16FFBD4B15FFBD4B15FF'
'BE4C16FFBE4C16FFBD4B15FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBE4C16FF'
(... etc...)
"""
Необходимо получить материал между скобками и бинарными данными blob после строки с текстурой до тех пор, пока не будет достигнута пустая строка. Есть несколько «текстурных» абзацев.Многострочное регулярное выражение Python
Вот что я получил до сих пор:
p = re.compile(r'texture\s+(\S+)\s+\[(\d+\s+\d+\s+\d+)\]\s+(\'.+\')')
matches = p.findall(data)
for match in matches:
print match[0]
print match[1]
print match[2]
print "---------------"
дает следующий результат:
mytexture
640 480 1
'BE4C16FFBD4B15FFBD4B15FFBD4B15FFBD4B15FFBE4C16FFBE4C16FFBD4B15FFBD4B15FF'
---------------
mytexture2
640 480 1
'BE4C16FFBD4B15FFBD4B15FFBD4B15FFBD4B15FFBE4C16FFBE4C16FFBD4B15FFBD4B15FF'
---------------
Я уверен, что re.MULTILINE следует использовать, чтобы получить весь блоб, но его непонятно мне, как захватить все двоичные линии. Мой вопрос в основном заключается в следующем: как можно захватить несколько строк и узнать, когда «остановить» (то есть: пустая строка достигнута).
Да, это именно то, что я искал, спасибо! Я также просмотрел re.DOTALL, но не смог сделать regexp «stop» на пустой строке. Следовательно, '(. *?) \ N \ s * \ n' и DOTALL сохраняют мой день. Думаю, я тоже неправильно понимал флаг MULTILINE: S –
Мне всегда нужно вернуться и перечитать документацию, прежде чем использовать re.MULTILINE, чтобы убедиться, что я правильно ее использую. :-П –