我正在尝试为标签制作一个模式,但是 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]**'
您正在使用 re 模式的开始:
<img=([^}]*)>
这将吞噬(作为第 1 组)前导之后的所有字符<img=
,包括其他标签!!!,直到最后>
它可能会狼吞虎咽;*
是贪婪的——它尽可能多地吞噬。不确定为什么要特别排除闭括号}
?也许您的意思是排除封闭的尖括号 ( >
)。
对于非贪心匹配,*
您需要; 而不是*?
; 这样,您将尽可能少地狼吞虎咽,而不是尽可能多地狼吞虎咽。所以,我认为你的意思是:
p = re.compile(r'<img=([^>]*?)>(.*?)</img>', re.S)
这匹配一个img
标签(以及其中的所有标签),并且似乎正在执行您的意思的替换。