所以我有一个令牌列表,为简单起见我们可以假装是一个字符串列表:
["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 回答
假设您的令牌列表是:
您可以轻松地将其映射到字符串中:
然后你有一个像这样的模式:
您可以将模式映射到正则表达式:
可以在
'|'.join(str(i) for i, token in enumerate(tokens) if re.match('c.*', token))
找到2|3
. (或者根据您的需要加快索引/缓存速度 . )然后只使用正则表达式的任何函数 .