我正在使用一个专门的文本文件,它本质上是一个长长的名称列表以及与每个名称相关的随机字母序列。我正在尝试提取我感兴趣的特定共识序列。该序列可以说是“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 似乎不起作用或者我不能让它工作,也许是因为我输入了错误的命令。
最佳答案
您可以组合 regexpr
和 substr
:
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"
关于r - 如何在 R 中提取与正则表达式 (regexpr) 索引相关的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18446089/