跳过正则表达式模式中的HTML标记

时间:2009-04-09 01:26:23

标签: python regex

我正在尝试编写一个正则表达式模式(在python中)来重新格式化这些模板引擎文件。

基本上这个计划看起来像这样:

[$$price$$]
{
    <h3 class="price">
    $12.99
    </h3>
}

我正在尝试删除任何额外的标签\空格\新行,所以它应该如下所示:

[$$price$$]{<h3 class="price">$12.99</h3>}

我写了这个:(\ t | \ s)+?除了在html标签内匹配之外它有效,所以h3变成了h3class,我无法弄清楚如何让它忽略标签内的任何内容。

3 个答案:

答案 0 :(得分:5)

使用正则表达式处理HTML非常容易出错;它们根本就不是正确的工具。

相反,使用支持HTML / XML的库(例如lxml)来构建DOM样式的对象树;在原地修改树中的文本段,并使用所述库再次生成输出。

答案 1 :(得分:0)

试试这个:

\r?\n[ \t]*

编辑:我们的想法是删除所有换行符(Unix:“\ n”,或Windows:“\ r \ n”)以及紧随其后的任何水平空格(TAB或空格)。

答案 2 :(得分:0)

艾伦,

我必须同意Charles的观点,最安全的方法是解析HTML,然后只处理Text节点。听起来有点过分,但这是最安全的。

另一方面,只要你相信HTML代码是正确的(即在标签中不包含无效的&lt;和&gt;,如:&lt; a title =),正则表达式中有一种方法可以做到这一点。 “&lt;这是一个测试&gt;”href =“look here”&gt; ...)

然后,你知道任何文字都必须在&gt;之间。和&lt;除了在开头和结尾(如果您只是获取页面的快照,否则最少有HTML标记。)

所以......你仍然需要两个正则表达式:找到文本'&gt; [^&lt;] +&lt;',然后应用你提到的其他正则表达式。

另一种方式,是拥有这样的东西(未经过测试!):

'(&lt; [^&gt;] *&gt;)|([\ r \ n \ f] +)'

这将找到一个或多个标记。当您找到标签时,如果找不到标签,请不要替换为空字符串。

相关问题