首页 文章

标记列表上的正则表达式/全局而不是字符串

提问于
浏览
1

所以我有一个令牌列表,为简单起见我们可以假装是一个字符串列表:

["hello", "world", "this", "is", "some", "interesting", "input"]

我希望能够编写一个模式,理想情况下看起来像一个正则表达式,并给我一个正则表达式引擎的完整力量,但如果我只有全球风格的通配符也很好 .

因此,如果我有一个模式(使用想象的语法,以 $ 开头的事物被命名为通配符),如下所示:

["hello", "$part1", "some", "$part2"]

我希望能够在上面的输入上运行它,看到它匹配,并且能够为 $part1 获得 ["world", "this", "is"] ,为 $part2 获得 ["interesting", "input"] .

我可以将我的令牌列表编码为字符串,将我的模式令牌列表编译成普通的旧正则表达式模式,然后使用正则表达式 . 但我的令牌列表实际上并不包含字符串,它包含具有我不想丢失的元数据的令牌对象 .

我目前的方向是在关于NFA的Russ Cox's article之后实现我自己的自定义正则表达式引擎,这肯定会有效,但这相当复杂 .

有没有更简单的方法在Python中实现这一点?

1 回答

  • 1

    假设您的令牌列表是:

    ['a', 'b', 'cx', 'cy']
    

    您可以轻松地将其映射到字符串中:

    '<0><1><2><3>'
    

    然后你有一个像这样的模式:

    ['a', '<token>*', 'c.*']
    

    您可以将模式映射到正则表达式:

    '<0>(.*)<(2|3)>'
    

    可以在 '|'.join(str(i) for i, token in enumerate(tokens) if re.match('c.*', token)) 找到 2|3 . (或者根据您的需要加快索引/缓存速度 . )

    然后只使用正则表达式的任何函数 .

相关问题