Извлечь конкретный раздел из файла LaTeX с помощью Python

У меня есть набор файлов LaTeX. Я хотел бы извлечь "абстрактный" раздел для каждого:

\begin{abstract}

.....

\end{abstract}

Я попробовал предложение здесь: Как разобрать файл LaTex

И попробовал:

A = re.findall(r'\\begin{abstract}(.*?)\\end{abstract}', data)

Где данные содержат текст из файла LaTeX. Но A это просто пустой список. Любая помощь будет принята с благодарностью!

2 ответа

Решение

.* не соответствует переводу строки, если не указан флаг re.S:

re.findall(r'\\begin{abstract}(.*?)\\end{abstract}', data, re.S)

пример

Рассмотрим этот тестовый файл:

\documentclass{report}
\usepackage[margin=1in]{geometry}
\usepackage{longtable}

\begin{document}
Title maybe
\begin{abstract}
Good stuff
\end{abstract}
Other stuff
\end{document}

Это получает резюме:

>>> import re
>>> data = open('a.tex').read()
>>> re.findall(r'\\begin{abstract}(.*?)\\end{abstract}', data, re.S)
['\nGood stuff\n']

Документация

От re Веб-страница модуля:

re.S
re.DOTALL

Сделать '.' специальный символ соответствует любому символу вообще, включая перевод строки; без этого флага '.' будет соответствовать всему, кроме новой строки.

. не соответствует символу новой строки. Тем не менее, вы можете передать флаг, чтобы попросить включить новые строки.

Пример:

import re

s = r"""\begin{abstract}
this is a test of the
linebreak capture.
\end{abstract}"""

pattern = r'\\begin\{abstract\}(.*?)\\end\{abstract\}'

re.findall(pattern, s, re.DOTALL)

#output:
['\nthis is a test of the\nlinebreak capture.\n']
Другие вопросы по тегам