所以我有一个令牌列表,为简单起见,我们可以假装是一个字符串列表:
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中完成此操作?
答案 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))
。 (或者根据您的需要使用更快的索引/缓存。)
然后只对正则表达式使用任何函数。