2012-10-04 45 views
17

次の例のようにすべてのコメントを抽出する方法が見つからないようです。2つの文字列の間の正規表現マッチング?

>>> import re 
>>> string = ''' 
... <!-- one 
... --> 
... <!-- two -- -- --> 
... <!-- three --> 
... ''' 
>>> m = re.findall ('<!--([^\(-->)]+)-->', string, re.MULTILINE) 
>>> m 
[' one \n', ' three '] 

ブロックtwo -- --は、正規表現が正しくないために最もよくマッチしません。誰かが正しい方向に2つの文字列の間の一致を抽出する方法を教えてくださいできますか?


こんにちは私はあなたの意見で示唆したものをテストしました....ここではほとんどアップグレードしていない作業ソリューションです。

>>> m = re.findall ('<!--(.*?)-->', string, re.MULTILINE) 
>>> m 
[' two -- -- ', ' three '] 
>>> m = re.findall ('<!--(.*\n?)-->', string, re.MULTILINE) 
>>> m 
[' one \n', ' two -- -- ', ' three '] 

ありがとうございました!

+3

[]の間にあるものはすべて1文字なので、そのグループは問題の一部であるとは見なされません... –

+2

're.findall( ''、string、re.DOTALL)' should行う。疑問符は貪欲でないので、 '^ \( - >)'は必要ありません。 – BrtH

+0

あなたはちょうど言葉を探しているようですね?もしそうなら、 'm = re.findall( '[\ w] +'、string、re.MULTILINE)'の何が問題なのですか?また、stringは本当に悪い名前の文字列です。 – Ben

答えて

32

このトリックを一般に

m = re.findall ('<!--(.*?)-->', string, re.DOTALL) 
+0

迅速で正確な対応に感謝します。 –

+1

MULTILINEフラグは必要ありません。 –

+0

@AlanMoore、ありがとうございます。返信を更新しました – iruvar

3

を行う必要があり、regular grammarを有する2つの区切り文字の間の任意のマッチングを行うことは不可能です。 Specifcally

、あなたが入れ子に許可した場合、

<!-- how do you deal <!-- with nested --> comments? --> 

あなたが問題に実行されます。ですから、この特定の問題を正規表現で解くことができるかもしれませんが、あなたが書く正規表現は、他の奇妙なコメントのネスティングによって壊れる可能性があります。

任意のコメントを解析するには、context free grammarsの解析方法に進む必要があります。これを行う簡単な方法は、pushdown automatonを使用することです。

+1

ネストされたコメントがすべて共通しているとは思わない。何かが内部に処理されている場合は、コメントのポイントを破るか? –

+1

HTMLでは不可能なようです。 http://stackoverflow.com/questions/442786/are-nested-html-comments-possible私はそれを認識することが重要だと思うので、私はこれをここに残すつもりですが、私はアップボートを期待していません。 – Wilduck

+1

有限状態機械は文脈自由文法を解析することができません - プッシュダウンのオートマトンを使うことができます。 –

関連する問題