多行模式和标签搜索
我正在尝试为标签创建一个模式,但是使用的替换方法只替换了行首的第一个字符和行末的三个字符。我想要替换整行中的所有标签,并且支持多行替换。
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 个回答
1
你在正则表达式的开头使用了:
<img=([^}]*)>
这段代码会把在 <img=
后面的所有字符(作为第一组)都抓取进来,包括其他标签!!!,一直抓到它能抓到的最后一个 >
为止;这里的 *
是贪婪的——它会尽可能多地抓取内容。不太明白你为什么要特别排除闭合大括号 }
?也许你是想排除闭合尖括号 >
。
如果你想要非贪婪匹配,那就要用 *?
,这样的话,它会尽量少抓取内容,而不是尽量多抓取。所以,我想你是想要:
p = re.compile(r'<img=([^>]*?)>(.*?)</img>', re.S)
这段代码会匹配一个 img
标签(以及它里面的所有标签),看起来正好在进行你想要的替换。