用正则表达式替换HTML标签中的字符

0 投票
4 回答
537 浏览
提问于 2025-04-16 21:18

可能重复的问题:
替换所有不属于HTML标签的<和>

  1. 使用Python
  2. 我知道大家都不喜欢关于HTML标签的正则表达式问题,但我只是想通过这个练习来帮助我学习正则表达式。

要替换的内容(1可以是任何字符):

<b>< </b>
<b> < </b>
<b> <</b>
<b><</b>
<b><111</b>
<b>11<11</b>
<b>111<</b>
<b>11<11</b>

<b>
<<<
</b>

替换为:

<b>& </b>
<b> & </b>
<b> &</b>
<b>&</b>
<b>&111</b>
<b>11&11</b>
<b>111&</b>
<b>11&11</b>

<b>
&
</b>

我在网上搜索过,尝试了很多自己的解决方案。请问,这可能吗?如果可以的话,怎么做呢?

我最好的猜测是这样的:

re.sub(r'(?<=>)(.*?)<(.*?)(?=</)', r'\1&lt;\2', string)

但在使用re.DOTALL和'<<<'等时,这个方法就不管用了。

4 个回答

0

如果你的字符串是a,这个方法看起来可以用:

re.sub('<+([^b/])','&\\1',a)

还有一个更通用的版本...

re.sub('(<[^<>]+>)([^<>]*)<+([^<>]*)(<[^<>]+>)','\\1\\2&\\3\\4',a)
1

我真心希望这个方法不要在实际的HTML中使用,但这里有一个适合你示例数据的解决方案。请注意,它用的是&lt;来替换,就像你示例代码中那样,而不是像你示例数据中用的&

re.sub(r'<+([^<>]*?)(?=</)', r'&lt;\1', your_string)
0

你可以使用类似这样的代码:

re.sub(r'(?:<(?!/?b>))+', '&', string)

如果你想让它也能和其他一些标签一起工作,可以使用类似这样的代码:

re.sub(r'(?:<(?!/?\w+[^<>]*>))+', '&', string)

撰写回答