【问题标题】:Finding the indexes of multiple/overlapping matching substrings查找多个/重叠匹配子串的索引
【发布时间】:2018-09-02 19:09:30
【问题描述】:

我有一个字符串s="CCCGTGCC" 和一个子字符串ss="CC"。我想获取s 中所有以字符串ss 开头的索引。在我的示例中,我想取回数组 c(1,2,6)

有没有实现这个的字符串函数?请注意,我的字符串格式为 "CCCGTGCC",而不是 c("C","C","C","G","T","G","C","C")

grep 仅返回字符串中是否存在匹配项,而不返回字符串中匹配项的索引,除非我遗漏了某些内容。

【问题讨论】:

  • 你的意思是数组 [1, 2, 7] (实际上是 R 中的一个向量)?
  • gregexpr 是您正在寻找的函数,但是 reg exp 引擎“吞下”了标记,因此“CCC”被算作一个“CC”和一个“C”,虽然有些聪明使用正则表达式可能会解决这个问题。
  • 关于您的通知的通知,代码: substring("abcde",1:5,1:5) 将字符串 "abcde" 分解为字符向量并粘贴 ((substring("abcde",1: 5,1:5) ),collapse="") 做相反的事情

标签: r regex


【解决方案1】:

尝试使用gregexprperl=TRUE 并使用带有前瞻断言的perl 正则表达式(参见?regex):

gregexpr("(?=CC)","CCCGTGCC",perl=TRUE)
[[1]]
[1] 1 2 7
attr(,"match.length")
[1] 0 0 0

【讨论】:

  • 嗯,我被卡住了,但没想到“向前看”。我想知道为什么 pattern = "CC" 不起作用...
  • @RomanLuštrik:请参阅 James 对 OP 的评论。如果找到匹配项,则将其从正在搜索的字符串的其余部分中删除。请注意,"match.length" 为零(如果pattern="CC" 则为 2)。
  • +1 以获得关于前瞻断言的"match.length" 的澄清评论。我从来没有考虑过以这种方式使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 2014-09-15
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多