0

我正在尝试为标签制作一个模式,但是 sub 方法只是替换了行尾的第一个字符和 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=([^}]*)>

这将吞噬(作为第 1 组)前导之后的所有字符<img=包括其他标签!!!,直到最后>它可能会狼吞虎咽;*是贪婪的——它尽可能多地吞噬。不确定为什么要特别排除闭括号}?也许您的意思是排除封闭的尖括号 ( >)。

对于非贪心匹配,*您需要; 而不是*?; 这样,您将尽可能少地狼吞虎咽,而不是尽可能多地狼吞虎咽。所以,我认为你的意思是:

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

这匹配一个img标签(以及其中的所有标签),并且似乎正在执行您的意思的替换。

于 2009-09-09T14:48:59.503 回答