我想从一段html代码中删除所有下标,但下标“rep”除外。
例如,字符串"t<sub>i</sub>(10) = 23, p<sub>rep</sub>=.2"
应该变为:"t(10) = 23, p<sub>rep</sub>=.2"
我正在尝试这样的事情:
txt <- "t<sub>i</sub>(10) = 23, p<sub>rep</sub>=.2"
gsub(pattern="<sub>(?!rep).*</sub>",replacement="",txt,perl=TRUE)
但问题是这行代码删除了html文件中第一个<sub>
和最后一个</sub>
之间的所有内容 ...
答案 0 :(得分:1)
使用XML
库来解析html。您可以选择要删除的节点并使用removeNodes
:
library(XML)
xData <- htmlParse("t<sub>i</sub>(10) = 23, p<sub>rep</sub>=.2")
remNodes <- xData['//sub[not(contains(., "rep"))]']
removeNodes(remNodes)
> xData
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>t(10) = 23, p<sub>rep</sub>=.2</body></html>
答案 1 :(得分:1)
建议在处理HTML时使用 Parser ,但要解释您的问题......
问题是.*
将一直向下到字符串,然后最终backtrack以允许结束标记匹配。只要它回溯到第二个结束标记,正则表达式就会匹配。
简单的解决方法是.*
跟?
一起使用,以防止贪婪。这意味着在找到结束标记之前,查找任何字符(除了换行符)并查找(0
或更多)。指定问号?
后,一旦找到结束标记,就会告诉正则表达式引擎(不要贪婪.. ... 停止... 强>)
txt <- 't<sub>i</sub>(10) = 23, p<sub>rep</sub>=.2'
gsub('<sub>(?!rep).*?</sub>', '', txt, perl=T)
# [1] "t(10) = 23, p<sub>rep</sub>=.2"