多行模式和标签搜索

0 投票
1 回答
513 浏览
提问于 2025-04-15 14:11

我正在尝试为标签创建一个模式,但是使用的替换方法只替换了行首的第一个字符和行末的三个字符。我想要替换整行中的所有标签,并且支持多行替换。

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 标签(以及它里面的所有标签),看起来正好在进行你想要的替换。

撰写回答