re.sub不要替换匹配

时间:2019-01-14 11:58:46

标签: regex python-3.x

我有一个html文件,其中包含一些需要删除的部分。 除一个以外,所有部分将被删除。我能够给您举一个小例子,但是正则表达式编辑器识别该部分是很奇怪的。

我想删除<!---->之间的所有内容,但这不起作用。

test = '<br/><br/>    </span>    <!--TABLE<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0 style=\'border-collapse:collapse;border:none\'>        <tr style=\'height:12.95pt\'>            <td width=225 valign=top style=\'width:109.45pt;border:solid windowtext 1.0pt;padding:2.4pt 5.4pt 2.4pt 5.4pt;height:12.95pt\'>                <span style=\'font-family:"Arial",sans-serif\'>                    <b>Kontosaldo in \x80</b>                </span>            </td>        </tr>        <tr style=\'height:12.95pt\'>            <td width=146 valign=top style=\'width:109.45pt;border:solid windowtext 1.0pt;padding:2.4pt 5.4pt 2.4pt 5.4pt;height:12.95pt\'>                <span style=\'font-family:"Arial",sans-serif\'>                    [substringR]                </span>            </td>        </tr>    </table>TABLE-->'
r = re.compile(r"(?<=<!--)([\s\n.<>\]\[\\=;,€\/\-\'\":\w\n]+)(?=-->)")
mystring = r.sub('', test)

1 个答案:

答案 0 :(得分:4)

<!---->之间的所有内容” 是这个表达式:

<!--.*?-->

替换为空字符串。用re.DOTALL flag编译。


注意:使用正则表达式修改HTML会导致灾难。不要这样这个特殊的任务,即“删除注释”是一个灰色区域:Regex无法处理可以任意嵌套的语言(例如HTML),但是不能嵌套HTML注释,因此很有可能会起作用。但是,请勿尝试使用“替换所有表”使用相同的方法,否则将无法正常工作。

但是,HTML仍然可以起作用,并且仍然可以通过多种方式严重破坏,即使对于此任务, 仍将是HTML文件,当您尝试对它们使用看似安全的正则表达式时,它们会完全瓦解。< / p>

正确的方法就像@Aaron所建议的:将HTML文件解析为DOM树。查找要删除的节点。将DOM树写回到文件中;如以下答案所示:How to find all comments with Beautiful Soup