web-dev-qa-db-ja.com

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

ありがとう!

18
Hrvoje Špoljar

これでうまくいくはずです

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

一般に、2つの区切り文字の間で 通常の文法 を使用して任意のマッチングを行うことは不可能です。

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

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

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

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

3
Wilduck