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】:“<!--
和 -->
之间的所有内容” 都是这个表达式:
<!--.*?-->
替换为空字符串。使用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 不替换匹配 [重复]的主要内容,如果未能解决你的问题,请参考以下文章