2

我正在使用一个专门的文本文件,它本质上是一长串名称和与每个名称相关联的随机字母序列。我正在尝试提取我感兴趣的特定共有序列。序列是,比如说“STXDXIK”,X 是任何字母。我将文本文件红色为 R 并将其命名为“TEXT”。

然后我使用正则表达式来隔离包含序列的条目列表,称之为“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 似乎不起作用或者我不能让它起作用,也许是因为我输入了错误的命令。

4

2 回答 2

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"
于 2013-08-26T14:36:55.340 回答
1

使用 for 循环:

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"
于 2013-08-26T14:22:50.983 回答