0

タグのパターンを作成しようとしていますが、サブメソッドは行末の最初の文字と 3 を置き換えるだけで、行のすべてのタグを複数行に置き換えようとしています

p=re.compile('<img=([^}]*)>([^}]*)</img>', re.S)
p.sub(r'[img=\1]\2[/img]','<img="test">dsad</img> <img="test2">dsad2</img>')
output:
'**[**img="test">dsad</img> <img="test2"]dsad2**[/img]**'
4

1 に答える 1

1

reのパターンの開始に向けて使用しています:

<img=([^}]*)>

これは、他のタグを含め<img=、先頭の後のすべての文字を(グループ1として)飲み込みます!!! 、最後まで、それはおそらくむさぼり食う可能性があります。GREEDYです-それは可能な限り多くをむさぼり食います。特に中括弧を除外している理由がわかりませんか?代わりに、閉じた山かっこを除外するつもりだったのかもしれません()。>*}>

欲張りでないマッチングの場合、の代わりに、 ;*が必要です。*?それで、あなたはあなたができる限りではなく、あなたができる限り少なくゴブリングするでしょう。だから、私はあなたが意味すると思います:

p = re.compile(r'<img=([^>]*?)>(.*?)</img>', re.S)

これは1つのタグ(およびその中のすべてのタグ)と一致imgし、意味する置換を正確に実行しているように見えます。

于 2009-09-09T14:48:59.503 に答える