Запись результата регулярного документа обратно в документ в Python

1

Я пытаюсь создать скрипт python для выполнения ряда замещений регулярных выражений в документе LaTeX непосредственно перед его набором, но у меня, похоже, возникла проблема с вступлением в силу замещений. Мой сценарий выглядит следующим образом:

# -*- coding: utf-8 -*-
import os, re, sys
tex = sys.argv[-1]
tex_file = open(tex, "r+")
tex_file_data = tex_file.read()

# DO SOME REGEXES
tex_file_data = re.sub(r"\b_(.*?)_\b", r"\emph{\1}", tex_file_data)
tex_file.write(tex_file_data)

# PROCESS THE DOCUMENT
os.system("xelatex --shell-escape " + tex_file.name)

Однако каждый раз, когда я пытаюсь обработать документ с помощью этого скрипта, я получаю обычный ! Missing $ inserted. ! Missing $ inserted. ошибка. Согласно регулярному выражению, эти подчеркивания должны были быть заменены подходящим синтаксисом. Однако, если я подстановлю окончательную строку для print(tex_file_data), консоль отобразит документ с вступлением в силу изменений. Насколько я могу судить, проблема заключается в том, что отредактированный документ не сохраняется правильно, но я не уверен, что я делаю неправильно.

Как я могу исправить эту проблему, чтобы скрипт мог использоваться для обработки документов?

EDIT: В предложении @Yuushi я редактировал сценарий следующим образом:

# -*- coding: utf-8 -*-
import os, re, sys
with open(sys.argv[-1], "r+") as tex_file:
  tex_file_data = tex_file.read()
  tex_file_data = re.sub(r"\_(.*)\_", r"\\emph{\1}", tex_file_data)
  tex_file.write(tex_file_data)
os.system("xelatex --shell-escape " + tex_file.name)

Тем не менее, я все еще получаю ! Missing $ inserted. ! Missing $ inserted. ошибка, которая предполагает, что исходный документ все еще отправляется в компилятор LaTeX, а не в регулярное выражение.

  • 0
    Вы все еще пропускаете seek . Я отредактировал свой ответ с полным примером.
Теги:
latex

1 ответ

1
Лучший ответ

У вас, вероятно, есть две проблемы. Во-первых, после read поток устанавливается в конечную позицию, поэтому перед вызовом write вам нужно сбросить его до начала с tex_file.seek(0). Во-вторых, вы никогда не закрываете файл, и записи, вероятно, буферизованы, поэтому вам нужно tex_file.close() в конце. Еще лучше было бы использовать оператор with:

with open(sys.argv[-1], 'r+') as tex_file:
    tex_file_data - tex_file.read()
    tex_file_data = re.sub(r"\_(.*)\_", r"\\emph{\1}", tex_file_data)
    tex_file.seek(0)
    tex_file.write(tex_file_data)

os.system("xelatex --shell-escape " + tex_file.name)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню