2

正则表达式爱好者之一。我有一个格式为字符串的向量:

<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Verdana" STYLE="font-size: 10px" size="10" COLOR="#FF0000" LETTERSPACING="0" KERNING="0">Desired output string containing any symbols</FONT></P></TEXTFORMAT>

我知道用正则表达式解析这类东西的危险。然而,了解如何有效地提取较大字符串匹配的输出子字符串(即>...<字体标签的角度引号的内容)将很有用。我能做的最好的是:

require(stringr)
strng = str_extract(strng, "<FONT.*FONT>") # select font statement
strng = str_extract(strng, ">.*<")         # select inside tags
strng = str_extract(strng, "[^/</>]+")     # remove angle quote symbols

在 R 中实现这一目标的最简单公式是什么?

4

2 回答 2

3

使用str_match,而不是str_extract(或可能str_match_all)。包裹你想要的部分提炼括号内匹配。

str_match(strng, "<FONT[^<>]*>([^<>]*)</FONT>")

或者解析文档并以这种方式提取内容。

library(XML)
doc <- htmlParse(strng)
fonts <- xpathSApply(doc, "//font")
sapply(fonts, function(x) as(xmlChildren(x)$text, "character"))

正如 agstudy 所提到的,xpathSApply它采用了一个使事情变得更容易的函数参数。

xpathSApply(doc, "//font", xmlValue)
于 2013-10-22T09:46:35.907 回答
2

你也可以这样做,gsub但我认为你的输入向量有太多的排列可能会导致它中断......

gsub( "^.*(?<=>)(.*)(?=</FONT>).*$" , "\\1" , x , perl = TRUE )
#[1] "Desired output string containing any symbols"

解释

  • ^.*- 匹配字符串开头的任何字符
  • (?<=>)- 积极的后向零宽度断言,其中后续匹配仅在此之前有效,即>
  • (.*)- 然后匹配任何字符(这现在是一个编号的捕获组)...
  • (?=</FONT>)- ...直到你匹配"</FONT>"
  • .*$- 然后将任何字符匹配到字符串的末尾

在替换中,我们用编号的捕获组替换所有匹配的东西\\1,并且只有一个捕获组是和之间的所有>内容</FONT>

使用后果自负。

于 2013-10-22T09:47:18.160 回答