2013-02-14 8 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)) 

당신이 the source code 보는 경우 re.Scanner.scan은 하나의 패스하게, 당신이 게시 코드와는 달리

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

를 산출 문자열을 통해. 일치가 이루어지면 다음 경기는 마지막 경기가 끝난 곳부터 시작됩니다.

re.Scanner의 첫 번째 인수는 2 튜플의 목록 인 lexicon입니다. 각 2- 튜플은 정규식 패턴과 동작입니다. 동작은 문자열, 호출 가능 (함수) 또는 None (동작 없음) 일 수 있습니다.

패턴은 모두 하나의 복합 패턴으로 컴파일됩니다. 따라서 패턴이 어휘집에 나열되는 순서가 중요합니다. 일치하는 첫 번째 패턴이 승리합니다.

일치하는 경우 호출 가능한 경우 호출되거나 단순히 문자열 인 경우 반환됩니다. 반환 값은 tokens 목록에 수집됩니다.