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