复杂输入的分词

4 投票
1 回答
709 浏览
提问于 2025-04-17 00:05

我正在尝试在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', '.')
    ]

假设上面的结果是由一个生成器产生的。我的当前实现可以工作,虽然代码有点丑,而且不容易扩展来支持链接。

任何帮助都将非常感激。

更新一下,把想要的语法从复杂的嵌套列表结构改成简单的元组流。为了让我们人类更好理解。链接文本中的格式是可以的。这里有一个简单的解析器,它生成了我想要的分词结果,但仍然无法处理链接或脚注。

1 个回答

1

好吧,这里有一个更完整的解析器,它的扩展性足够强,可以满足我未来的各种需求。这个解析器只花了我三个小时。虽然速度不是特别快,但我写的这种解析器的输出通常会被大量缓存。即使有了这个分词器和解析器,我的整个引擎的代码行数仍然不到默认的python-textile渲染器的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', '.')
]

撰写回答