2013-01-22 18 views
5

Próbuję policzyć wystąpienia 3 kolejnych zdarzeń "a", "aaa".dopasowanie do regex na R gregexpr

Ciąg składa się z niższego alfabetu, np. "abaaaababaaa"

Próbowałem następujący fragment kodu. Ale zachowanie nie jest dokładnie tym, czego szukam.

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

Chciałbym dopasowanie powrotu 3 przypadki występowania „aaa”, w przeciwieństwie do 2

Załóżmy indeksacji rozpoczyna 1

  • pierwsze wystąpienie „aaa” jest o indeksie 3
  • drugi występowanie „aaa” jest wskaźnikiem 4. (nie jest objęte gregexpr)
  • trzeci występowanie „aaa” jest w indeksie 10.

Odpowiedz

6

złapać nakładające się mecze, można użyć uprzedzona tak:

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

Jednak wasze mecze są teraz tylko jedno „a”, więc może to skomplikować dalsze przetwarzanie tych meczów, zwłaszcza jeśli nie zawsze szukasz wzorów o stałej długości.

1

Wiem, że późno, ale chciałem podzielić się z tego rozwiązania,

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 

Mocno inspirowany this answer z R-pomoc przez Fran.

+0

Wykonuje to również zadanie (do góry), ale chcę uniknąć wyraźnych pętli, moje ciągi są dość długie. –

+0

@AdityaSihag, z pewnością można go było zoptymalizować, po prostu chciałem też wrzucić to rozwiązanie. –

0

Oto sposób wyodrębniania wszystkich nakładających się dopasowań o różnej długości przy użyciu gregexpr.

x<-"abaaaababaaa" 
# nest in lookahead + capture group 
# to get all instances of the pattern "(ab)|b" 
matches<-gregexpr('(?=((ab)|b))', x, perl=TRUE) 
# regmatches will reference the match.length attr. to extract the strings 
# so move match length data from 'capture.length' to 'match.length' attr 
attr(matches[[1]], 'match.length') <- as.vector(attr(matches[[1]], 'capture.length')[,1]) 
# extract substrings 
regmatches(x, matches) 
# [[1]] 
# [1] "ab" "b" "ab" "b" "ab" "b" 

Sztuką jest, aby otoczyć deseń w grupie przechwytywania i tej grupy przechwytywania w twierdzeniu uprzedzona. gregexpr zwróci listę zawierającą pozycje początkowe z atrybutem capture.length, macierz, w której pierwsza kolumna odpowiada długościom dopasowania pierwszej grupy przechwytywania. Jeśli przekształcisz to w wektor i przeniesiesz go do atrybutu match.length (który jest zerowy, ponieważ cały wzorzec był wewnątrz asercji wyprzedzającej), możesz przekazać go do regmatches, aby wyodrębnić ciągi.

Zgodnie z typem wyniku końcowego, z kilkoma modyfikacjami, może to być wektoryzowane, dla przypadku, gdy x jest listą ciągów.

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" 
Powiązane problemy