正则表达式:匹配除特定文件之外的html文件中的所有下标

时间:2014-07-03 13:31:42

标签: regex r

我想从一段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>之间的所有内容 ...

2 个答案:

答案 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"