1

単一の正規表現を使用して、文字列からいくつかのデータを抽出したいと考えています。これらの部分を括弧内の部分式として含むパターンを作成しました。perl のような環境では、これらの部分式をmyvar1=$1; myvar2=$2;などのコードで変数に渡すだけですが、R でこれを行うにはどうすればよいでしょうか? 今のところ、これらの発生にアクセスする唯一の方法は、regexec を使用することです。regexec は perl 構文をサポートしていないなどの理由で、あまり便利ではありません。これは私が今しなければならないことです:

getoccurence <- function(text,rex,n) { # rex is the result of regexec function
  occstart <- rex[[1]][n+1]
  occstop  <- occstart+attr(rex[[1]],'match.length')[n+1]-1
  occtext  <- substr(text,occstart[i],occstop)
  return(occtext)
}
mytext <- "junk text, 12.3456, -01.234, valuable text before comma, all the rest"
mypattern <- "([0-9]+\\.[0-9]+), (-?[0-9]+\\.[0-9]+), (.*),"
rez <- regexec(mypattern, mytext)
var1 <- getoccurence(mytext, rez, 1)  
var2 <- getoccurence(mytext, rez, 2)  
var3 <- getoccurence(mytext, rez, 3)  

明らかに、それは非常に不器用な解決策であり、もっと良いものがあるはずです。アドバイスをいただければ幸いです。

4

3 に答える 3

2

をご覧になりましたregmatchesか?

> regmatches(mytext, rez)
[[1]]
[1] "12.3456, -01.234, valuable text before comma," "12.3456"                                      
[3] "-01.234"                     "valuable text before comma"                   

> sapply(regmatches(mytext, rez), function(x) x[4])
[1] "valuable text before comma"
于 2013-01-24T04:53:10.873 に答える
1

strapplygsubfn パッケージstrapplycは、これを 1 ステップで実行できます。

> strapplyc(mytext, mypattern)
[[1]]
[1] "12.3456"                    "-01.234"                   
[3] "valuable text before comma"

> # with simplify = c argument
> strapplyc(mytext, mypattern, simplify = c)
[1] "12.3456"                    "-01.234"                   
[3] "valuable text before comma"

> # extract second element only 
> strapply(mytext, mypattern, ... ~ ..2)
[[1]]
[1] "-01.234"

> # specify function slightly differently and use simplify = c
> strapply(mytext, mypattern, ... ~ list(...)[2], simplify = c)
[1] "-01.234"

> # same
> strapply(mytext, mypattern, x + y + z ~ y, simplify = c)
[1] "-01.234"

> # same but also convert to numeric - also can use with other variations above
> strapply(mytext, mypattern, ... ~ as.numeric(..2), simplify = c)
[1] -1.234

上記の例では、3 番目の引数は関数にすることも、例のように関数に変換される数式にすることもできます (LHS は引数を表し、RHS は本体を表します)。

于 2013-01-24T14:34:46.137 に答える
1

ではstringr、これはstr_matchor str_match_all(文字列内のすべてのパターンに一致させたい場合。 str_match行列をstr_match_all返します。行列のリストを返します。

library(stringr)
str_match(mytext, mypattern)
str_match_all(mytext, mypattern)
于 2013-01-24T13:27:13.630 に答える