用REGEX替换HTML标记中的字符

时间:2011-07-11 21:53:09

标签: python html regex

  

可能重复:
  Replace all < and > that are NOT part of an HTML tag

  1. 使用Python
  2. 我知道这里有多少人讨厌围绕HTML标签的REGEX问题,但我只是这样做是为了帮助我学习REGEX。
  3. 替换(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和'&lt;&lt;&lt;'等等分开了。

4 个答案:

答案 0 :(得分:0)

我真诚地希望从未在实际的HTML上使用过,但这是一个适用于您的示例数据的解决方案。请注意,它会替换为示例代码中的&lt;,而不是样本数据中的&

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

答案 1 :(得分:-1)

如果a是你的字符串,这似乎有效:

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

和第二个版本,更通用......

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

答案 2 :(得分:-1)

您可以使用以下内容:

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

如果您希望它与(某些)其他标签一起使用,您可以使用以下内容:

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

答案 3 :(得分:-1)

此测试的正则表达式适用于您给定的测试数据:

reobj = re.compile(r"""
    # Match left angle brackets not part of HTML tag.
    <+               # One or more < but only if
    (?=[^<>]*</\w+)  # inside HTML element contents.
    """, re.VERBOSE)
result = reobj.sub("&", subject)