【问题标题】:Regex for tree structures?树结构的正则表达式?
【发布时间】:2009-05-17 17:57:26
【问题描述】:

是否有用于搜索和修改树结构的正则表达式等价物?我正在寻找简洁的迷你语言(如 perl 正则表达式)。

这里有一个例子可以说明我在寻找什么。

<root>
  <node name="1">
    subtrees ....
  </node>
  <node name="2">
    <node name="2.1">
     data
    </node>
    other subtrees...
  </node>
</root>

在上述树上可能的操作是“将节点 2.1 处的子树移动到 节点 1 处的子树。”操作的结果可能类似于..

<root>
  <node name="1">
    subtrees ....
    <node name="2.1">
     data
    </node>
  </node>
  <node name="2">
    other subtrees...
  </node>
</root>

应该支持搜索和替换操作,例如查找所有具有至少 2 个子节点的节点、查找数据以“a”开头的所有节点,如果子树至少有 2 个其他兄弟节点,则将其替换为“b”等。

对于唯一维度跨过字符串长度的字符串,我们可以使用正则表达式执行上述许多操作(或它们的一维等效项)。我想知道是否有树的等价物。 (而不是单个正则表达式,您可能需要编写一组转换规则,但这没关系)。

我想知道是否有一些简单的迷你语言(不是正则表达式本身,而是通过库等可以像正则表达式一样访问的东西)。执行这些操作?最好是作为python库。

【问题讨论】:

  • 想一想那个东西的语法会是怎样的...... :)
  • 嗯,您能更明确地说明您拥有什么以及正则表达式应该做什么吗?
  • 这需要更具体 - 你是在解析 XML 还是什么?
  • 你不应该称它为“常规”,因为“常规”需要“无上下文”,而树不是。
  • 我同意,称其为“常规”是不正确的,但是,我与常规语言进行比较的想法是在实用性方面,我想在字符串中进行搜索和替换 - 我做正则表达式,我想在树上做同样的事情,我用..?

标签: java python c regex tree-structure


【解决方案1】:

斯坦福大学的 TSurgeon 和 Tregex 能够做到这一点。你可以从http://nlp.stanford.edu/software/tregex.shtml下载库

【讨论】:

  • Java 或 python 的任何非 GPL 替代方案?
【解决方案2】:

我不知道可以做到这一点的通用语言,但在我看来,您正在寻找类似 @​​987654321@ 的东西。

【讨论】:

  • 我看过 XPath。这似乎很有希望,但它似乎不能处理节点集上的表达式(例如,查找所有具有至少 2 个兄弟姐妹的节点)。它的功能有限。
【解决方案3】:

TXL 用于基于模式的树重写。

使用模式重写树也可以使用解析器工具包完成,例如ANTLR

使用自下而上的树重写、google BURS 或 BURG 生成代码。

【讨论】:

  • TXL 看起来很有前途,但是 ANTLR 和 TXL 都假设上下文无关语法,这在您还需要执行解析时很重要。但是,出于转换和树上类似正则表达式的行为的目的,它应该明确地依赖于上下文。对于我想要的一些用例,请参阅我对上述问题的说明(例如:使用兄弟姐妹的条件进行搜索)。
【解决方案4】:

在二叉搜索树中导航需要状态(我在哪个节点?)和比较(该值小于还是大于该值?),这是有限状态自动机无法完成的。

当然,您可以搜索具有给定值的节点,但是如果您不知道其父节点,例如,您如何删除不是叶子的节点?

即使你通过节点​​提供的信息知道父节点,你如何确定左子树的最小值,将其移除并放置在节点中?

我认为你对 FSA 的要求太高了。

【讨论】:

  • 如果每个节点都包含所有可能匹配的数据(例如祖先和父状态)的相关数据(以及与之相关的状态),则自动机可以工作?
  • -- 继续 -- 然后与其他节点相关的子表达式可以调用子引擎来返回映射到转换的状态或布尔值。
【解决方案5】:

This 文章提供了一些关于递归 Perl 正则表达式的精彩提示,但老实说,很少看到以这种方式处理的树结构。

更典型的是,人们会编写一个状态机样式的解析器,它可能使用正则表达式来解析树中的每个特定节点。

Expat 可能是一个很好的例子。

【讨论】:

    【解决方案6】:

    由 Scala、F#、Erlang 和 Haskell 等语言提供的模式匹配(我相信还有更多)旨在简洁地操作树等数据结构,尤其是与递归一起使用时。

    here 是对 Scala 中模式匹配功能的高级视图。显示的示例确实不能做到模式匹配。

    维基百科也有一些关于模式匹配的参考。 Herehere

    【讨论】:

      【解决方案7】:

      我有点惊讶XSLT 没有作为答案出现。诚然,我不认为它是一种特别优雅的语言,并且大多数现有的解决方案倾向于支持过程方法而不是模式匹配,并且仅仅因为将 XML 应用于 XML 而盲目地应用它而得到了一个非常糟糕的代表——但除此之外它符合要求。可惜它的规范表示是如此冗长,虽然......

      【讨论】:

      • 现在,XSLT 似乎是最接近我想要的,但编写上下文相关查询似乎很复杂,我的问题是找到比 xslt 更好的东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      相关资源
      最近更新 更多