标记复杂输入

时间:2011-08-22 03:41:11

标签: python parsing text stream tokenize

我正在尝试用Python标记以下输入:

text = 'This @example@ 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 个答案:

答案 0 :(得分:1)

好吧,here's a more complete parser有足够的可扩展性来做我将来可能需要的任何事情。它只花了三个小时。它并不是非常快速,但通常我写的解析器类的输出无论如何都是高度缓存的。即使使用了这个标记器和解析器,我的完整引擎仍然在<默认python-textile渲染器的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', '.')
]