re.sub 不替换匹配 [重复]

Posted

技术标签:

【中文标题】re.sub 不替换匹配 [重复]【英文标题】:re.sub don't replace match [duplicate] 【发布时间】:2019-06-08 10:01:50 【问题描述】:

我有一个 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)

【问题讨论】:

与问题没有直接关系,但我使用 BeautifulSoap 而不是使正则表达式复杂化。像这里的东西:***.com/questions/33138937/… BeautifulSoap 对我来说是一个新的 @Aaron_ab ! 【参考方案1】:

&lt;!----&gt; 之间的所有内容” 都是这个表达式:

<!--.*?-->

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


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

但是,HTML 仍然可以正常工作,并且在很多方面仍然被严重破坏,即使对于这项任务,当您尝试在它们上使用这种看似安全的正则表达式时,是完全分解的 HTML 文件。

正如@Aaron 建议的那样,正确的方法是:将 HTML 文件解析为 DOM 树。查找要删除的节点。将 DOM 树写回文件;如这个答案所示:How to find all comments with Beautiful Soup。

【讨论】:

它的简单程度令人恐惧。难怪它对我不起作用。 但是请注意我的警告 - 这种简单性是危险的。不要尝试使用正则表达式执行比这更复杂的任务。甚至“修改此属性值”也是一项需要 HTML 解析器的任务,我什至不是在谈论诸如“添加表格行”之类的结构修改。

以上是关于re.sub 不替换匹配 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用re.sub将文本替换为匹配到的内容

re.sub 替换为匹配的内容

python 正则表达式re.sub()提取字符串以及去除空格

python字符串替换之re.sub()

re.sub

带有标志的 Python re.sub 不会替换所有出现