2013-01-22 15 views
5

私は3つの連続した "a"イベントのインスタンス、すなわち"aaa"を数えようとしています。regex match on R gregexpr

文字列は、下位アルファベットを構成します。 "abaaaababaaa"

次のコードを試しました。しかし、その行動は私が探しているものではありません。 I 2.

とは対照的に、一致が "AAA" 発生の3つのインスタンスを返すたい

x<-"abaaaababaaa"; 
gregexpr("aaa",x); 

は指数化は、 "AAA" の最初の発生は1

  • 始まると仮定しますインデックスで3
  • 「AAA」の第二の発生がある(これは gregexprによって捕捉されていない)
  • 「AAA」の第三の発生率4でありますインデックス10.

答えて

6

重複試合をキャッチするために、あなたはこのように先読みを使用することができます。

gregexpr("a(?=aa)", x, perl=TRUE) 

はしかし、あなたの試合は今ちょうどシングル「A」ですので、さらに処理を複雑かもしれません特に固定長のパターンを探しているとは限りません。

1

重フランでR-ヘルプからthis answerに触発

your.string <- "abaaaababaaa" 
nc1 <- nchar(your.string)-1 
x <- unlist(strsplit(your.string, NULL)) 
x2 <- c() 
for (i in 1:nc1) 
x2 <- c(x2, paste(x[i], x[i+1], x[i+2], sep="")) 
cat("ocurrences of <aaa> in <your.string> is,", 
    length(grep("aaa", x2)), "and they are at index", grep("aaa", x2)) 
> ocurrences of <aaa> in <your.string> is, 3 and they are at index 3 4 10 

、私が遅刻を知っているが、私はこのソリューションを共有したいと思いました。

+0

これはあまりにも(アップ投票された)仕事ですが、私は明示的なループを避けたい、私の文字列はかなり長いです。 –

+0

@AdityaSihag、それは間違いなく最適化することができた、私はちょうどそこにこのソリューションを投げたいと思った。 –

0

gregexprを使用して、さまざまな長さの重複する一致をすべて抽出する方法です。

トリックは、キャプチャグループ内のパターンを囲み、キャプチャグループを先読みアサーションで囲みます。 gregexprは、属性がcapture.lengthの開始位置を含むリストを返します。最初の列は最初の取得グルー​​プの一致長です。これをベクトルに変換してmatch.length属性に移動すると(パターン全体が先読みアサーションの内部にあるため、すべて0になります)、文字列を抽出するにはregmatchesに渡すことができます。

xが文字列のリストである場合、最終結果のタイプによって暗示されるように、いくつかの変更を加えて、ベクトル化することができます。

x<-list(s1="abaaaababaaa", s2="ab") 
matches<-gregexpr('(?=((ab)|b))', x, perl=TRUE) 
# make a function that replaces match.length attr with capture.length 
set.match.length<- 
function(x) structure(x, match.length=as.vector(attr(x, 'capture.length')[,1])) 
# set match.length to capture.length for each match object 
matches<-lapply(matches, set.match.length) 
# extract substrings 
mapply(regmatches, x, lapply(matches, list)) 
# $s1 
# [1] "ab" "b" "ab" "b" "ab" "b" 
# 
# $s2 
# [1] "ab" "b"