Python 标记化复杂输入

Python 标记化复杂输入,python,parsing,text,stream,tokenize,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") ('ex

我正在尝试用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', '.')
    ]
假设以上内容是由发电机产生的。我的作品,虽然代码有点可怕,不容易扩展到支持链接

如蒙协助,将不胜感激

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

好吧,具有足够的可扩展性,可以在将来做我可能需要的任何事情。只花了三个小时。它的速度不是很快,但通常我正在编写的解析器类的输出都被大量缓存。即使有了这个标记器和解析器,我的完整引擎的时钟仍然小于默认python textile渲染器SLoC的75%,同时保持更快的速度。都没有正则表达式

脚注解析仍然存在,但与链接解析相比,这是次要的。输出(截至本次发布)为:


有趣。您想避免使用正则表达式的具体原因是什么?可以帮助您,并且可以从box@NullUserException正则表达式比当前解决方案慢几个数量级,并且在开始处理嵌套规则集时变得复杂。@JBernardo shlex用于解析类似shell的空格分隔语法;我的问题域并不接近,除非你能给我一个改变模块中基本解析器的使用示例。你发布的是你输入的AST。通常使用递归下降解析器来获取此结构,而不仅仅是lexer。使用解析器生成器对您来说是一种选择吗?作为速度差异的简要说明:解析器的当前状态以13.4毫秒的速度解析项目自述(),而Textile在同一文档上需要249毫秒,生成几乎相同的HTML标记。哎哟
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', '.')
]