我正在尝试用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渲染器的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', '.')
]