2013-08-26 5 views
2

본질적으로 긴 이름 목록과 각 이름과 관련된 임의의 문자 시퀀스 인 특수 텍스트 파일을 사용하고 있습니다. 흥미로운 특정 일치 시퀀스를 추출하려고합니다. 시퀀스는 "STXDXIK"라고 ​​말할 수 있습니다. X는 임의의 문자입니다. 나는 R에 텍스트 파일을 빨간색으로 표시하고 "TEXT"라고 명명했습니다.정규 표현식 (regexpr) 색인과 관련된 텍스트를 추출하는 방법 R

다음 정규 표현식을 사용하여 시퀀스가 ​​포함 된 항목 목록을 분리하여 "ylist"라고합니다.

ylist<- TEXT[grep("ST[A-Z]D[A-Z]IK", TEXT, value=FALSE, perl=FALSE)] 

그런 다음 regexpr 함수를 사용하여 관심이있는 시퀀스의 위치를 ​​찾고 "r"이라고합니다.

r<- regexpr("ST[A-Z]D[A-Z]IK", ylist) 

이제 문제는이 시퀀스가있는 위치의 인덱스를 시작 위치와 일치 개수와 함께 얻는 것입니다. 그러나 전체 시퀀스를 추출하는 데 관심이 있으며 전체 시퀀스가 ​​무엇인지 중요하기 때문에 "ylist"의 인덱스가 아닙니다. 누구든지 도와 줄 수 있습니까?

나는 R에서 substr과 regmatches 함수를 시도했지만 substr은이 시퀀스와 많은 일치를 많이 갖고 있기 때문에 실용적이지 않은 각 일치에 적용해야한다. regmatches는 작동하지 않거나 ' 나는 잘못된 명령을 입력했기 때문에 그것을 작동시키지 않습니다. 사용

+0

왜'ylist'를 만드나요? 'r - regexpr ("ST [A-z] D [A-z] IK", TEXT)'충분하지 않습니까? – sgibb

답변

1

A-루프 :

TEXT <- c("tedSTXDXIKsslker","janetlkajsdfSTXDXIKalkse","maggiesdfes","sdfjkSTXDXIKryan") 
ylist<- grep("ST[A-Z]D[A-Z]IK", TEXT, value=TRUE, perl=FALSE) 

r<- regexpr("ST[A-Z]D[A-Z]IK", ylist) 

strings <- character() 
for(i in seq_along(ylist)){strings <- c(strings,substr(ylist[i],start=r[i],stop=r[i]+6))} 

> strings 
[1] "STXDXIK" "STXDXIK" "STXDXIK" 

또는 stringr 패키지를 사용하여 한 줄에

.

require(stringr) 
> str_extract(string=TEXT,pattern="ST[A-Z]D[A-Z]IK") 
[1] "STXDXIK" "STXDXIK" NA  "STXDXIK" 

strings2 <- str_extract(string=TEXT,pattern="ST[A-Z]D[A-Z]IK") 
strings2 <- strings2[!is.na(strings2)] 
> strings2 
[1] "STXDXIK" "STXDXIK" "STXDXIK" 
+0

이것에 대한 많은 감사, 그것은 작동합니다! 또한 for 루프를 사용하면 substr 섹션에 양수 또는 음수를 단순히 추가하여 시퀀스를 둘러싼 측면 시퀀스를 볼 수 있습니다. – Bez

3

당신은 regexprsubstr을 결합 할 수 있습니다 :

TEXT <- c("tedSTXDXIKsslker","janetlkajsdfSTXDXIKalkse","maggiesdfes","sdfjkSTXDXIKryan") 
r <- regexpr("ST[A-z]D[A-z]IK", TEXT) 
s <- substr(TEXT, r, r+attr(r, "match.length")-1) 
s 
# [1] "STXDXIK" "STXDXIK" ""  "STXDXIK" 

를 필터링 할 경우 "" 당신은 사용할 수 있습니다

s <- s[nchar(s)>0] 
# [1] "STXDXIK" "STXDXIK" "STXDXIK" 

편집 : 추가 gregexpr 예를

TEXT <- c("tedSTXDXIKsslker","janetlkajsdfSTXDXIKalkse","maggiesdfes","sdfjkSTXDXIKryan", 
     "sdfjkSTXDXIKryansdfjkSTXDXIKryan") 
## use gregexpr instead of regexpr 
r <- gregexpr("ST[A-z]D[A-z]IK", TEXT) 
## because gregexpr returns a list, we have to use mapply (or a for loop) 
## please note: I use substring instead of substr here because substr returns only a vector of the same size as the input vector. 
mapply(FUN=function(str, rx)substring(str, rx, rx+attr(rx, "match.length")-1), str=TEXT, rx=r) 

# $tedSTXDXIKsslker 
# [1] "STXDXIK" 
# 
# $janetlkajsdfSTXDXIKalkse 
# [1] "STXDXIK" 
# 
# $maggiesdfes 
# [1] "" 
# 
# $sdfjkSTXDXIKryan 
# [1] "STXDXIK" 
# 
# $sdfjkSTXDXIKryansdfjkSTXDXIKryan 
# [1] "STXDXIK" "STXDXIK" 
+0

니스. 처음에'regexpr'이 목록을 반환했다고 생각했기 때문에'substr'에 전달하려고 시도했을 때 위치와 길이를 목록의 요소로 색인하려고했습니다. 분명히 작동하지 않았습니다. 나는 그것을 더 효율적으로 사용하는 방법을 볼 수있어 기쁩니다! – dayne

+0

@sgibb이 점에 대해 많은 감사드립니다. 또한 이것은 substr과 regexpr을 결합하는 아주 좋은 방법입니다! 단일 항목 내에서 여러 개의 시퀀스 일치를 설명하기 위해 위의 스크립트를 어떻게 수정할 수 있을지 궁금하십니까? 위의 "r"인수에서 gregexpr을 시도했는데 여러 시퀀스 일치 항목에 대해 올바른 색인을 제공하지만 "s"인수가 작동하지 않습니다! – Bez

+0

@Bez :'gregexpr'은리스트를 반환합니다. 그래서 for 루프 나 mapply를 사용해야합니다. 내 편집을 참조하십시오. – sgibb

관련 문제