【问题标题】:R: indexing result from a regular expressionR:正则表达式的索引结果
【发布时间】:2014-08-11 18:16:36
【问题描述】:

我正在尝试使用通过搜索字符串返回的索引来查找每个字符实例。当我使用 gregexp(模式,文本)时,

lookfor<-"n"
string<-"ATTnGGCnATTn"
gregexpr(pattern=lookfor,text=string)

我得到以下信息:

[[1]]

[1]  4  8  12

attr(,"match.length")

[1] 1 1 1

attr(,"useBytes")

[1] TRUE

如何索引第一行以便能够使用这些位置?提前感谢您的帮助!

【问题讨论】:

  • 除非那是一个无效的正则表达式。
  • @Richard 你是对的。
  • 您在寻找n的字母吗?
  • @Richard 我正在寻找每个字母 n 的位置。

标签: regex r indexing string-matching


【解决方案1】:

如果要提取所有匹配项,可以使用内置函数regmatches()

m <- gregexpr(regexp,string)
regmatches(string,m)

这将返回一个字符向量列表,因为字符串可以大于长度 1。如果您只传递一个字符串,您可以绕过列表获得匹配向量

regmatches(string,m)[[1]]

【讨论】:

  • 感谢您的回复。当我尝试你的建议时,我在 gregexpr 中得到了搜索词,在这种情况下是“n”,但不是字符串中的位置。
  • @SeaJane 好吧,首先,您的示例似乎不是有效的正则表达式,因此测试起来有点困难。 {n} 语法无效,R 为我抛出错误。这正是你跑的?
  • 我试图让某些东西正常工作,所以我发布了一些荒谬的东西,而不是简化,请原谅我。我使用了 regexp
【解决方案2】:

这是查找索引的分步方法。我怀疑有更有效的方法可以达到相同的结果。参数 fixed = TRUE 告诉 R 寻找文字小写“n”,而不是将其视为正则表达式。

这样做后,末尾的 [[1]] 部分仅保留列表的索引元素

要显示所有索引,请使用length 函数。

string="ATTnGGCnATTn"
index  <- gregexpr(pattern = "n", text = string, fixed = TRUE)[[1]] 
first.index  <- index[1:length(index)]

【讨论】:

  • 我试过你的例子,但结果看起来像这样:
    [[1]]
    [1] 4 8 12
    attr(," match.length")
    [1] 1 1 1
    attr(,"useBytes") [1] TRUE

    结果被格式化为长度为1。
  • 2583119,很抱歉上面的格式。我尝试了您的示例,但结果如下所示: [[1]] [1] 4 8 12 attr(,"match.length") [1] 1 1 1 attr(,"useBytes") [1 ] TRUE 结果被格式化为长度为 1。
  • SeaJane,我刚刚复制了三行(以string =开头,以index结尾)],运行时得到了这个结果。 [1] 4 8 12
  • @2582119 好的,谢谢。位置是正确的,问题是对这些位置的访问。我无法将数据强制转换为可以获取位置 4 8 或 12 的位置,然后使用这些位置在类似字符串中查找信息。
【解决方案3】:

我想我自己想出了答案! 在 Bioconductor 中使用 Biostrings 包:

string<-"ATTnGGCnATTn"  
matches<-matchPattern(pattern="n", subject=string)
m<-as.vector(ranges(matches))

现在我可以调用所有相似字符串中“n”的每个位置。感谢那些花时间回答的人。

【讨论】:

  • 你真的应该看看包stringr
  • @Richard 您建议在 stringr 中使用哪个函数?
  • 好吧,我仍然不知道你在做什么,但str_locate_all(string, "n") 给出的结果与gregexpr(pattern=lookfor,text=string)[[1]] 相同,&gt; which(strsplit(string, "")[[1]] == "n") 给出的结果与4 8 12 相同
  • @Richard 抱歉,我无法很好地解释自己。所有这些的结果都是一样的,真​​实的。我想做的是使用结果。我需要访问每个位置并从该确切位置的相似字符串中查找数据。
  • 好的,没问题。相似的字符串之一是什么?
【解决方案4】:

加法(2):考虑了一会儿,我得出的结论是,您可以在原来的gregexpr调用中简单地使用unlist

> unlist(gregexpr("n", string))
# [1]  4  8 12

来自您的评论

我正在寻找每个字母n的位置

因此,您可以执行以下任何操作:

> which(strsplit(string, "")[[1]] == "n")
# [1]  4  8 12
> cumsum(nchar(strsplit(string, "n")[[1]])+1)
# [1]  4  8 12
> nc <- 1:nchar(string)
> which(substring(string, nc, nc) == "n")
# [1]  4  8 12

关于类似字符串的加法(1)(在另一个答案中评论):您可以再次使用strsplit,并使用上述方法之一找到这些值

> string2 <- "ATTTGGCCATTG"
> w <- which(strsplit(string, "")[[1]] == "n")
> strsplit(string2, "")[[1]][w]
[1] "T" "C" "G"

【讨论】:

  • 没错!四个慷慨选项中的前三个正是我所需要的。最后是我一直遇到的问题,我无法访问这些位置。
  • 哈!那是下一步,自然而然。我只需要数字位置就可以定位大量字符串的这些更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多