2

正規表現愛好家向けの 1 つ。次の形式の文字列のベクトルがあります。

<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>

この種のものを正規表現で解析する危険性を認識しています。ただし、より大きな文字列一致の出力部分文字列 (つまり>...<、font タグの山形引用符の内容) を効率的に抽出する方法を知っておくと役立ちます。私ができる最善のことは次のとおりです。

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 に答える