2011-08-22 4 views
4
내가 파이썬에서 다음과 같은 입력 토큰 화를 시도하고있어

:토큰 화 복잡한 입력

tokens = [ 
     ('text', 'This '), 
     ('enter', 'code'), 
      ('text', "example") 
     ('exit', None), 
     ('text', ' is '), 
     ('enter', 'a'), 
      ('text', "neither"), 
      ('href', "/defn/neither"), 
     ('exit', None), 
     ('text', ' complete'), 
     ('enter', 'footnote'), 
      ('id', 1), 
     ('exit', None), 
     ('text', ' '), 
     ('enter', 'strong'), 
      ('text', 'nor'), 
     ('exit', None), 
     ('text', ' trite, '), 
     ('enter', 'strong'), 
       ('text', 'though '), 
       ('enter', 'em'), 
        ('text', 'simple'), 
       ('exit', None), 
     ('exit', None), 
     ('text', '.') 
    ] 

척 :

text = 'This @[email protected] is "neither":/defn/neither complete[1] *nor* trite, *though _simple_*.' 

내가 정규 표현식의 사용을 피하면서 다음과 같은 것이 같은 것을 제작해서를 위는 발전기에 의해 생산되고있다. 내 current implementation 코드는 약간 끔찍하지만 쉽게 링크를 지원하도록 확장되지는 않지만 작동합니다.

도움을 주시면 감사하겠습니다.

원하는 구문을 복잡한 중첩 목록 구조에서 단순한 튜플 스트림으로 변경하려면 업데이트되었습니다. 우리 인간을위한 들여 쓰기. 링크 텍스트 내에서 서식을 지정할 수 있습니다. 여기에 내가 찾고있는 렉싱 결과를 생성하지만 여전히 링크 또는 각주를 처리하지 않는 a simple parser입니다.

+1

흥미 롭습니다. regexes를 사용하지 않으려는 이유는 무엇입니까? – NullUserException

+0

['shlex'] (http://docs.python.org/library/shlex.html)이 도움을 줄 수 있으며 즉시 사용할 수 있습니다 – JBernardo

+0

@ NullUserException 정규 표현식은 현재 솔루션보다 느린 순서로 복잡해집니다 중첩 된 규칙 집합을 처리하기 시작할 때. – amcgregor

답변

1

글쎄, here's a more complete parser 미래에 필요할 수도있는 것을 충분히 확장 할 수 있습니다. 3 시간 밖에 걸리지 않았습니다. 대단히 빠른 것은 아니지만 일반적으로 쓰는 파서 클래스의 출력은 대용량으로 캐시됩니다. 이 토크 나이저와 파서를 설치했다하더라도 내 전체 엔진은 기본 파이썬 - 텍스타일 렌더러의 SLoC의 75 % 인에서 여전히 약간 클럭 속도를 유지합니다. 정규 표현식이없는 모든 것.

각주 구문 분석은 그대로 유지되지만 링크 구문 분석과 비교하면 사소한 것입니다. 출력 (이 게시 시점) :

tokens = [ 
    ('text', 'This '), 
    ('enter', 'code'), 
     ('text', 'example'), 
    ('exit', None), 
    ('text', ' is '), 
    ('enter', 'a'), 
     ('text', 'neither'), 
     ('attr', ('href', '/defn/neither')), 
    ('exit', None), 
    ('text', ' complete[1] '), 
    ('enter', 'strong'), 
     ('text', 'nor'), 
    ('exit', None), 
    ('text', ' trite, '), 
    ('enter', 'strong'), 
     ('text', 'though '), 
     ('enter', 'em'), 
      ('text', 'simple'), 
     ('exit', None), 
    ('exit', None), 
    ('text', '.') 
] 
+0

속도 차이에 대한 빠른 메모 : 파서의 현재 상태는 13.4 msec vs. Textile에서 프로젝트 README (https://github.com/marrow/marrow.texting/blob/develop/README.textile)를 구문 분석합니다. 거의 동일한 HTML 마크 업을 생성하면서 동일한 문서에서 249msec 걸립니다. 아야! – amcgregor

관련 문제