【问题标题】:Tokenizing complex input标记复杂输入
【发布时间】:2011-08-22 03:41:10
【问题描述】:

我正在尝试在 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,它生成了我正在寻找的词法分析结果,但仍然不处理链接或脚注。

【问题讨论】:

  • 有趣。您想避免使用正则表达式的任何特殊原因?
  • shlex 可以帮助您并且开箱即用
  • @NullUserException 正则表达式比当前解决方案慢几个数量级,并且在您开始处理嵌套规则集时变得复杂。
  • @JBernardo shlex 用于解析类似 shell 的空格分隔语法;我的问题域没有接近,除非你能给我一个改变该模块中存在的基本解析器的使用示例。
  • 您发布的是您输入的 AST。您通常使用递归下降解析器来获取此结构,而不仅仅是词法分析器。您是否可以选择使用解析器生成器?

标签: python parsing text stream tokenize


【解决方案1】:

好吧,here's a more complete parser 具有足够的可扩展性来做我将来可能需要的任何事情。只用了三个小时。它不是非常快,但通常我正在编写的解析器类的输出无论如何都会被大量缓存。即使有了这个标记器和解析器,我的完整引擎仍能以

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

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

【讨论】:

猜你喜欢
  • 2018-08-14
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多