2013-12-21 2 views
-1
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 следует использовать, чтобы получить весь блоб, но его непонятно мне, как захватить все двоичные линии. Мой вопрос в основном заключается в следующем: как можно захватить несколько строк и узнать, когда «остановить» (то есть: пустая строка достигнута).

ответ

1

re.MULTILINE влияет на смысл ^ и $ якорей. Я думаю, что вы хотите здесь re.DOTALL, без которого символ . никогда не будет соответствовать новой строке.

Чтобы соответствовать всему тексту до следующей пустой строки, вы должны использовать что-то вроде (.*?)\n\s*\n. Это похоже на то, что вы ищете?

p = re.compile(r'texture\s+(\S+)\s+\[(\d+\s+\d+\s+\d+)\]\s+(.*?)\n\s*\n', re.DOTALL) 
matches = p.findall(input) 
for match in matches: 
    print match[0] 
    print match[1] 
    print match[2] 
    print "---------------" 

На ваш образец текста, это дает:

mytexture 
640 480 1 
'BE4C16FFBD4B15FFBD4B15FFBD4B15FFBD4B15FFBE4C16FFBE4C16FFBD4B15FFBD4B15FF' 
    'BE4C16FFBE4C16FFBD4B15FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBE4C16FF' 
    'BF4C16FFBF4C16FFBE4B15FFBE4B15FFBC4913FFBC4913FFBC4913FFBB4812FFBC4913FF' 
    'BC4A14FFBB4913FFBB4812FFBB4812FFBA4812FFBA4812FFBB4913FFBC4A16FFBB4915FF' 
    'B84612FFB84612FFB94713FFB84612FFB64410FFB64410FFB64410FFB4420EFFB3410DFF' 
    'FB03E0AFFB13F0BFB13F0BFFAE3C08FFAA3804FFAD3B07FFB03E0AFFB3410DFFB4420EFF' 
    'B4400DFFB13D0AFFB23C0AFFB03C09FFB23E0BFFB5410EFFB74310FFB94512FFB84411FF' 
--------------- 
mytexture2 
640 480 1 
'BE4C16FFBD4B15FFBD4B15FFBD4B15FFBD4B15FFBE4C16FFBE4C16FFBD4B15FFBD4B15FF' 
    'BE4C16FFBE4C16FFBD4B15FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBC4A14FFBE4C16FF' 
    (... etc...) 
--------------- 
+0

Да, это именно то, что я искал, спасибо! Я также просмотрел re.DOTALL, но не смог сделать regexp «stop» на пустой строке. Следовательно, '(. *?) \ N \ s * \ n' и DOTALL сохраняют мой день. Думаю, я тоже неправильно понимал флаг MULTILINE: S –

+0

Мне всегда нужно вернуться и перечитать документацию, прежде чем использовать re.MULTILINE, чтобы убедиться, что я правильно ее использую. :-П –

0

Вы были на месте, просто не так далеко, как на самом деле его реализации;)

import re 

input = """ 
endless gibberish 
some more stuff 

texture mytexture 
    '01AB01AB01AB01BA' 
    '01AB01AB01AB01BA' 
    '01AB01AB01AB01BA' 
    '01AB01AB01AB01BA' 

""" 

matches = re.findall(r'01AB01AB01AB01BA', input, re.M) 
print matches 
+0

Это заставляет меня задаться вопросом, если OP даже пытался что-нибудь, так как все, что вы сделали это принять их слова и переводить их непосредственно в коде. – SethMMorton

+0

@SethMMorton Я знаю правильно! Ну что ж. – brandonscript

+0

Мой плохой. И я был справедливо наказан -2 rep. Надеюсь, отредактированный пост станет более понятным. –

Смежные вопросы