嗨我可以用手来解决以下问题。我正在尝试编写一个python脚本,它将从tex文件中提取数字并将它们放入另一个文件中。输入文件是这样的:
\documentclass[]....
\begin{document}
% More text
\begin{figure}
figure_info 1
\end{figure}
\begin{figure}
figure_info 2
\end{figure}
%More text
输出文件应该是这样的:
\begin{figure}
figure_info 1
\end{figure}
\begin{figure}
figure_info 2
\end{figure}
感谢您的帮助。
答案 0 :(得分:2)
非常感谢我最终以这种方式完成的答案。它可能不是最佳方式,但它的工作原理。我尝试了几种建议的解决方案,但他们需要进行一些调整才能使它们发挥作用。
infile = open('data.tex', 'r')
outfile = open('result.tex', 'w')
extract_block = False
for line in infile:
if 'begin{figure}' in line:
extract_block = True
if extract_block:
outfile.write(line)
if 'end{figure}' in line:
extract_block = False
outfile.write("------------------------------------------\n\n")
infile.close()
outfile.close()
答案 1 :(得分:1)
您可以使用正则表达式(re
模块)findall()
函数来执行此操作。需要注意的事项是:
re.DOTALL
标志允许“。”匹配换行符,\end{figure}
以寻找最长的匹配r'raw string'
否则你必须将每个正则表达式反斜杠转义为“\\”,并将正则表达式中的文字反斜杠转义为“\\\\”。硬编码输入字符串也是如此。我们走了:
import re
TEXT = r"""\documentclass[]....
\begin{document}
% More text
\begin{figure}
figure_info 1
\end{figure}
\begin{figure}
figure_info 2
\end{figure}
%More text
"""
RE = r'(\\begin\{figure\}.*?\\end\{figure\})'
m = re.findall(RE, TEXT, re.DOTALL)
if m:
for match in m:
print match
print '' #blank line
答案 2 :(得分:0)
import re
# re.M means match across line boundaries
# re.DOTALL means the . wildcard matches \n newlines as well
pattern = re.compile('\\\\begin\{figure\}.*?\\\\end\{figure\}', re.M|re.DOTALL)
# 'with' is the preferred way of opening files; it
# ensures they are always properly closed
with open("file1.tex") as inf, open("fileout.tex","w") as outf:
for match in pattern.findall(inf.read()):
outf.write(match)
outf.write("\n\n")
编辑:发现了问题 - 不是在正则表达式中,而是在我正在匹配的测试文本中(我忘了逃避其中的\ b)。
答案 3 :(得分:0)
我可能会采取简单的方法,将整个文件读入一个字符串变量。这个
import string
f = open('/tmp/workfile', 'r')
f = f.read()
text = string.split(f,"\begin{figure} ")
text.pop(0)
for a in text:
a = string.split(a,"\end{figure}")
print "\begin{figure}\n"
print a[0]
print "\end{figure}"
您可以从命令行执行此操作:
your_script.py > output_file.tex