Замена частей текстового файла с помощью цикла forPython

Программы на Python
Anonymous
Замена частей текстового файла с помощью цикла for

Сообщение Anonymous »

Я использую библиотеку pylatexen для анализа файла LateX (.tex) на узлы (кортежи). Для каждого узла, соответствующего условию, код LateX, соответствующий указанному узлу, удаляется или заменяется.
Как я могу гарантировать, что все различные изменения происходят (последовательно) в одном и том же тексте, а не чем создавать отдельные версии для каждого цикла, каждый со своим собственным редактированием?
from pylatexenc import latexnodes, latexwalker
from pylatexenc.latexnodes import LatexNodesCollector, LatexTokenReader
from pylatexenc.latexnodes.nodes import LatexEnvironmentNode, LatexCharsNode, LatexMacroNode, LatexGroupNode, LatexNode
from pylatexenc.latexnodes.parsers import LatexGeneralNodesParser
from pylatexenc.latexwalker import LatexWalker
import re

data=(r'''
\section{Heading}\label{heading-label}
\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
Pater noster qui est in caelis.
\end{enumerate}

\section{Heading 2}
\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\setcounter{enumi}{1}
\item
Et ne nos inducat in tempore malo.\footnote{footnote}
\item
Gratia plena dominus tecum.
\item
Panem nostrum quotidanum da nobis hodie.
\end{enumerate}
''')

my_latex_walker = LatexWalker(data)
my_reader = LatexTokenReader(data)
parsing_state = my_latex_walker.make_parsing_state()
nodes, parsing_state_delta = my_latex_walker.parse_content(LatexGeneralNodesParser())
def traverse(node):
#Parsing for enumerate environments with additional arguments and removing them
if node.isNodeType(LatexEnvironmentNode) and node.environmentname == "enumerate":
subnodes = node.nodelist
if subnodes[0].isNodeType(LatexCharsNode)\
and subnodes[1].macroname == "def"\
and subnodes[2].isNodeType(LatexMacroNode)\
and subnodes[2].macroname == "labelenumi"\
and subnodes[3].isNodeType(LatexGroupNode):
string_inside_environment = (subnodes.latex_verbatim())
string_with_environment = (node.latex_verbatim())
if subnodes[5].macroname == "setcounter":
to_remove = str(subnodes[0].latex_verbatim()) + str(subnodes[1].latex_verbatim()) + str(subnodes[2].latex_verbatim()) + str(subnodes[3].latex_verbatim()) + str(subnodes[4].latex_verbatim()) + str(subnodes[5].latex_verbatim())
else:
to_remove = str(subnodes[0].latex_verbatim()) + str(subnodes[1].latex_verbatim()) + str(subnodes[2].latex_verbatim()) + str(subnodes[3].latex_verbatim()) + str(subnodes[4].latex_verbatim())

cleaned_string = (string_inside_environment.replace(to_remove,''))

#Parsing the cleaned up string for first level \item commands and replace by \mypara
my_latex_walker2 = LatexWalker(cleaned_string)
itemnodes, parsing_state_delta2 = my_latex_walker2.parse_content(LatexGeneralNodesParser())
for itemnode in itemnodes:
if itemnode.isNodeType(LatexMacroNode) and itemnode.macroname == "item":
revamped_string = cleaned_string.replace(itemnode.latex_verbatim(), r'\mypara ')
result = data.replace(string_with_environment, revamped_string)

if node.isNodeType(LatexGroupNode): #Recurse into groupnodes
traverse(node)

for node in nodes:
traverse(node)

print(data)


Подробнее здесь: https://stackoverflow.com/questions/787 ... a-for-loop

Вернуться в «Python»