2011-08-22 61 views
4

我试图来标记在Python以下输入:符号化复杂的输入

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

我想产生类似下面的同时避免使用正则表达式:

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', '.') 
    ] 

假装以上是由发电机产生的。我的current implementation的作品,虽然代码有点可怕,不容易扩展到支持链接。

任何援助将不胜感激。

已更新,将所需的语法从复杂的嵌套列表结构更改为简单的元组流。对我们人类的缩进。在链接文本中格式化是可以的。这里是a simple parser,它生成我正在寻找的lexing结果,但仍然不处理链接或脚注。

+1

有趣。为什么你想避免使用正则表达式的任何特定原因? – NullUserException

+0

['shlex'](http://docs.python.org/library/shlex.html)可以为您提供帮助并且开箱即用 – JBernardo

+0

@NullUserException正则表达式比当前解决方案慢几个数量级,并且变得复杂当你开始处理嵌套规则集时。 – amcgregor

回答

1

那么,here's a more complete parser具有足够的可扩展性来做我将来可能需要的任何东西。它只花了三个小时。这不是非常快,但通常我写的解析器类的输出总是被高速缓存。即使使用这个标记器和解析器,我的完整引擎仍然会以默认python-textile渲染器的75%的SLoC时钟速度运行,同时保持稍微更快的速度。没有正则表达式。

脚注解析仍然存在,但与链接解析相比,这是微不足道的。输出(截至本贴子)为:

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毫秒内分析项目README(https://github.com/marrow/marrow.texting/blob/develop/README.textile)与纺织品在同一文档上需要249毫秒,生成几乎相同的HTML标记。哎哟! – amcgregor