Поиск подстроки в Python RegEx с учетом парности скобок и без учета концов строк

Мне нужно на Python в LaTeX-статьях находить содержимое определенных макрокоманд LaTeX с учетом парности скобок, но без учета одиночных знаков перевода строки. Например,

\title[Синтез знаний: проблемы и методы\ldots]{Синтез знаний: проблемы и методы 
при построении моделей интеллектуальных систем}

\abstractrus{Рассматриваются задачи использования {\it  регулярных структур} памяти
$\Sigma =\{\Sigma(z)  \vert z\in M\}$ 
и~$\tilde{\Sigma}  =  \{\tilde{\Sigma}(z)   \vert z\in R\}$ 
для моделирования процессов синтеза структур 
знаний с помощью операций обработки знаний из специальных классов 
таких операций. Эти структуры определяют форматы используемых подобластей памяти. 

Форматы областей соответствуют структурам элементов доменов
(областей определения и значения операций)...}

\abstracteng{Cybernetic principles considered as the basis for the development...} 

Кратко по синтаксису. В LaTeX макрокоманды начинаются со знака \, затем, после названия макрокоманды, может следовать (а может и не следовать) необязательный параметр в паре квадратных скобок [], а обязательный параметр — в паре фигурных скобок {}. Также фигурные скобки используются для создания т.н. групп (что-то типа ограничения scope). Если же нужно вывести саму фигурную скобку, в тексте пишут, например, \{. LaTeX в процессе работы не учитывает множественные пробелы (они превращаются в один пробел) и одиночные переводы строк (также превращаются потом в один пробел). Новый абзац обозначается как два знака перевода строки. Это упрощенное описание синтаксиса LaTeX, но в моем случае оно полностью верно.

Мне нужна функция, возвращающая содержимое обязательного аргумента макрокоманды word из ранее прочитанного файла file типа

def tag(file, word): # file - содержимое LaTeX-файла, word - команда, содержимое которой парсим
    regex = re.compile(r'\\' + word + '\[?.*?\]?\{(.*)\}', re.MULTILINE)
    return regex.findall(file)

Эта функция хорошо работает только если содержимое нужной команды представляет собой одну отдельную строку (что логично), так как при использовании re.DOTALL видно, что она является слишком жадной. Мне же нужно, чтобы она не была ни слишком жадной, ни слишком ленивой и обязательно учитывала парность фигурных скобок, вложенность которых может быть довольно большой, а также игнорировала одинарные знаки конца строки (просто заменяла их на пробелы), но при этом два знака перевода строки превращала бы в одинарный знак конца строки.

То есть в результате мне нужно чтобы функция tag(file,'abstractrus') вернула

Рассматриваются задачи использования {\it регулярных структур} памяти $\Sigma =\{\Sigma(z) \vert z\in M\}$ и $\tilde{\Sigma} = \{\tilde{\Sigma}(z) \vert z\in M\}$ для моделирования процессов синтеза структур знаний с помощью операций обработки знаний из специальных классов таких операций. Эти структуры определяют форматы используемых подобластей памяти. 
Форматы областей соответствуют структурам элементов доменов (областей определения и значения операций)....

Буду благодарен за советы в построении нужного регулярно выражения.


Ответы (0 шт):