2013-02-14 5 views
3

Я пишу скрипт Python, который принимает открытый текст как ввод и производит Код LaTeX в качестве вывода. В какой-то момент сценарий должен процитировать все символы , которые имеют особое значение в TeX, например %, &, \, и поэтому .строка цитаты для ввода TeX

Это сложнее, чем я ожидал. В настоящее время у меня есть это:

def ltx_quote(s): 
    s = re.sub(r'[\\]', r'\\textbackslash{}', s) 
    # s = re.sub(r'[{]', r'\\{{}', s) 
    # s = re.sub(r'[}]', r'\\}{}', s) 
    s = re.sub(r'[&]', r'\\&{}', s) 
    s = re.sub(r'[$]', r'\\${}', s) 
    s = re.sub(r'[%]', r'\\%{}', s) 
    s = re.sub(r'[_]', r'\\_{}', s) 
    s = re.sub(r'[\^]', r'\\^{}', s) 
    s = re.sub(r'[~]', r'\\~{}', s) 
    s = re.sub(r'[|]', r'\\textbar{}', s) 
    s = re.sub(r'[#]', r'\\#{}', s) 
    s = re.sub(r'[<]', r'\\textless{}', s) 
    s = re.sub(r'[>]', r'\\textgreater{}', s) 
    return s 

Проблема заключается в { и } символы, так как они потенциально получают более ранней замены (\ ->\textbackslash{}), в этом случае не должен быть заменен. Я думаю, что решение будет делать все замены за один шаг, но я не знаю, как это сделать.

ответ

3

Возможно, попробуйте использовать недокументированные re.Scanner:

import re 
scanner = re.Scanner([ 
    (r"[\\]", r'\\textbackslash{}'), 
    (r"[{]", r'\\{{}'), 
    (r"[}]", r'\\}{}'), 
    (r".", lambda s, t: t) 
]) 

tokens, remainder = scanner.scan("\\foo\\{bar}") 
print(''.join(tokens)) 

дает

\\textbackslash{}foo\\textbackslash{}\\{{}bar\\}{} 

В отличие от кода, который вы в курсе, если вы посмотрите на the source code, то re.Scanner.scan делает только один проход через строку. Как только матч будет сделан, следующий матч начнется с того места, где закончилось последнее совпадение.

Первый аргумент re.Scanner - это lexicon - список 2-х кортежей. Каждый 2-кортеж представляет собой шаблон регулярного выражения и действие. Действие может быть строкой, вызываемой (функцией) или None (без действий).

Все образцы скомпилированы в один составной шаблон. Таким образом, порядок, в котором шаблоны перечислены в лексике, важен. Первый образец соответствует победе.

Если выполнено совпадение, действие вызывается, если оно вызываемо или просто возвращается, если строка. Возвращаемые значения собираются в списке tokens.

 Смежные вопросы

  • Нет связанных вопросов^_^