18

次の例のように、すべてのコメントを抽出する方法が見つからないようです。

>>> 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 ']

ありがとう!

4

2 に答える 2

38

これはトリックを行う必要があります

 m = re.findall ( '<!--(.*?)-->', string, re.DOTALL)
于 2012-10-04T21:24:10.170 に答える
3

一般に、正規文法を使用して2つの区切り文字間で任意のマッチングを行うことはできません。

具体的には、ネストを許可する場合、

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

問題が発生します。したがって、正規表現を使用してこの特定の問題を解決できる場合もありますが、作成した正規表現は、他の奇妙なコメントのネストによって壊れる可能性があります。

任意のコメントを解析するには、文脈自由文法を解析する方法に進む必要があります。これを行う簡単な方法は、プッシュダウンオートマトンを使用することです。

于 2012-10-04T21:25:09.783 に答える