树结构的正则表达式?

时间:2009-05-17 17:57:26

标签: java python c regex tree-structure

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

这是一个可以澄清我在寻找什么的例子。

<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”,等等。

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

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

7 个答案:

答案 0 :(得分:6)

斯坦福大学的TSurgeon和Tregex有能力做到这一点。您可以从http://nlp.stanford.edu/software/tregex.shtml

下载该库

答案 1 :(得分:5)

我不知道能够做到这一点的通用语言,但在我看来,你正在寻找像XPath这样的东西。

答案 2 :(得分:4)

基于模式的树重写有TXL

使用解析器工具包(例如ANTLR

)也可以使用模式进行树重写

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

答案 3 :(得分:1)

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

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

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

我认为你对FSA要求太多了。

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

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

here是一个非常高级别的视图,可以了解在Scala中匹配的内容。显示的示例实际上不做模式匹配正义。

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

答案 6 :(得分:1)

我有点惊讶XSLT没有作为答案。当然,我不认为它是一种特别优雅的语言,并且大多数现有的解决方案往往倾向于采用程序方法而不是模式匹配,并且由于XML被应用于XML而被盲目应用而得到了强烈的不良反应 - 但是否则它符合要求。可惜它的规范表达是如此冗长,但是......

相关问题