多行模式和标签搜索

时间:2009-09-09 14:38:31

标签: python regex multiline

我正在尝试为标签创建一个模式,但是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]**'

1 个答案:

答案 0 :(得分:1)

你正在使用你的模式开始:

<img=([^}]*)>

这将吞噬(作为第1组)所有字符在前导<img=之后,包括其他标记!!! ,直到最后>它可能会吞噬; *是贪婪的 - 它尽可能地吞噬。不确定为什么你专门排除闭括号}?也许你想要排除封闭的尖括号(>)。

对于非贪婪的匹配,而不是*,您需要*?;有了它,你将尽可能少地吞噬,而不是尽可能多地吞噬。所以,我认为你的意思是:

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

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