【问题标题】:Regular Expressions/globs on token lists instead of strings令牌列表而不是字符串上的正则表达式/glob
【发布时间】:2018-12-09 11:31:50
【问题描述】:

所以我有一个标记列表,为了简单起见,我们可以假设它是一个字符串列表:

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

我希望能够编写一个模式,它在理想情况下看起来像一个正则表达式,并为我提供了一个正则表达式引擎的完整功能,但如果我只有 glob 样式的通配符也可以。

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

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

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

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

我目前的方向是在 NFA 上按照Russ Cox's article 实现我自己的自定义正则表达式引擎,这肯定会奏效,但这相当复杂。

有没有更简单的方法在 Python 中完成此任务?

【问题讨论】:

  • 我最终只写了 NFA。效果很好。
  • 为什么更简单的方法不起作用?只是好奇。

标签: python regex glob


【解决方案1】:

假设您的令牌列表是:

['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)) 找到。 (或者根据您的需要使用更快的索引/缓存。)

然后,只需将任何函数用于正则表达式。

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 2022-06-16
    • 2013-04-26
    • 1970-01-01
    • 2015-07-19
    • 2016-08-12
    • 2017-04-24
    • 2013-10-06
    • 1970-01-01
    相关资源
    最近更新 更多