2009-05-17 15 views
6

ツリー構造を検索および変更するための正規表現に相当するものはありますか?簡潔なミニ言語(perl正規表現のような)が私が探しているものです。木構造の正規表現ですか?

ここでは、私が探しているものを明確にする例があります。

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

上記ツリーに可能であろう動作が「 にノード1におけるサブツリーのノード2.1で移動サブツリー」であります演算の結果があればそのデータは「a」と「b」と交換で始まるすべてのノードを見つけ、次のようになり..

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

検索し、少なくとも2人の子供を持つすべてのノードを見つけるような操作を交換するかもしれませんサブツリーには少なくとも2人の他の兄弟などがサポートされるべきです。

文字列の場合、唯一の次元が文字列の長さ全体にわたる場合、正規表現を使用して上記の操作の多く(またはその1D相当)を実行できます。私は木に相当するものがあるのだろうかと思います。 (単一の正規表現の代わりに、変換規則のセットを書く必要があるかもしれませんが、それは問題ありません)。

私はいくつかの単純なミニ言語(regex per.seではなく、ライブラリなどを介して正規表現としてアクセス可能なもの)があるかどうかを知りたいと思います。これらの操作を実行するには?好ましくは、Pythonライブラリとして。

+0

からダウンロードできます。 –

+0

Mmh、あなたはあなたが持っていることと正規表現がすべきことをより明示することができますか? – akappa

+0

これはより具体的である必要があります - あなたはXMLや何を解析していますか? –

答えて

1

バイナリ検索ツリーをナビゲートするには、有限状態オートマトンでは実行できない状態(ノードが何であるか)と比較(その値がそれよりも小さいか大きいか)が必要です。

確かに、特定の値でノードを検索することはできますが、親を知らない場合は葉ではないノードをどのように削除できますか?

ノードによって提供される情報を介して親を知っていても、左のサブツリーの最小値をどのように決定したら、それを削除してノードに配置しますか?

私はあなたがFSAにあまりにも多くを求めていると思います。

+0

オートマトンは、各ノードに、祖先や親状態などの一致する可能性のあるすべてのデータの関連データ(およびそれに関連する状態)が含まれていれば機能しますか? –

+0

- continuation - 次に、他のノードに関連するサブ表現はサブエンジンを呼び出して、遷移にマッピングされた状態またはブール値を返すことができます。 –

+0

しかし、削除すると、関連するデータを各ノードに "リフレッシュ"する必要があります。 – akappa

5

私はそれを行うことができる一般的なlangugaeを知りませんが、あなたはXPathのようなものを探しているようです。

+0

私はXPathを見てきました。有望に見えますが、ノードのセット(例えば、少なくとも2つの兄弟を持つすべてのノードを見つける)上で式を処理するようには見えません。機能は限られています。 – JSN

4

パターンベースのツリー書き換えにはTXLがあります。パターンと書き換え

ツリーはまた、ボトムアップツリー書き換え、グーグルBURS又はBURGとそのようなANTLR

コード生成などのパーサーツールキットを用いて行われます。

+0

TXLは非常に有望ですが、ANTLRとTXLの両方で文脈自由文法が仮定されています。これは、解析を行う必要がある場合にも重要です。しかし、ツリー上の変換や正規表現のような動作のためには、明示的に文脈依存でなければなりません。私が望むいくつかのユースケースについては、上記の質問の私の明確化を参照してください(例:兄弟の条件付き検索)。 – JSN

1

This記事には、再帰的なPerl正規表現についてのヒントがいくつか掲載されていますが、正直なところ、この方法ではツリー構造が近づくのはまれです。

より一般的には、正規マシンを使用してツリー内の特定のノードを解析するステートマシンスタイルのパーサーを作成します。

Expatおそらく良い例です。

1

Scala、F#、Erlang、Haskellなどの言語で提供されるパターンマッチングは、再帰で使用すると木などのデータ構造を簡潔に操作するように設計されています。

hereは、Scalaでpattrenのマッチングができることを非常に高いレベルで示しています。示された例は実際に正当なパターンマッチングをしません。

ウィキペディアには、パターンマッチングの参照がいくつかあります。 Hereおよびhere

1

XSLTは答えとして出てこなかったと私は多少驚いています。確かに、私はそれが特にエレガントな言語だとは思っていません。ほとんどの既存のソリューションは、パターンマッチングではなく手続き的アプローチを優先する傾向があり、XMLがXMLに適用されているという理由だけで盲目的に適用されてしまいますそれは法案に適合します。しかし、その正式な表現は非常に冗長ですが、...

+0

今、XSLTは私が望むものに最も近いと思われますが、文脈に敏感なクエリを書くのは複雑ですが、私の質問はxsltより優れたものを見つけることでした。 – JSN