Извлечь конкретный раздел из файла 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']