令牌列表而不是字符串上的正则表达式/全域

时间:2018-12-09 11:31:50

标签: python regex glob

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

console.log('ok')
this.setState({
   value: item.hotelinfo.hotelsearch.realname
},() => this.state.value) 

我希望能够编写一个模式,理想情况下,该模式看起来类似于正则表达式,并为我提供了正则表达式引擎的全部功能,但是如果我仅具有glob样式的通配符,那也很好。

因此,如果我有一个模式(具有一种想象中的语法,其中以["hello", "world", "this", "is", "some", "interesting", "input"] 开头的内容称为通配符),则如下所示:

$

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

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

我目前的方向是在NFA上Russ Cox's article之后实现我自己的自定义正则表达式引擎,这肯定会起作用,但这很复杂。

是否有更简单的方法可以在Python中完成此操作?

1 个答案:

答案 0 :(得分:2)

让我们假设您的令牌列表是:

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

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

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

然后您有一个类似的模式:

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

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

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

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

然后只对正则表达式使用任何函数。