R中的重叠比赛

hwn*_*wnd 14 regex string r dna-sequence stringi

我已经搜索过并且能够找到此论坛讨论以实现重叠匹配的效果.

我还发现了以下SO问题,即找到索引来执行此任务,但是无法找到任何关于在R语言中抓取重叠匹配的简洁信息.

我可以在支持(PCRE)的大多数语言中通过使用正向前端断言执行此任务,同时在先行内部实现捕获组以捕获重叠的匹配.

但是,虽然实际执行此操作的方式与其他语言相同,但perl=T在R中使用时,结果不会产生.

> x <- 'ACCACCACCAC'
> regmatches(x, gregexpr('(?=([AC]C))', x, perl=T))[[1]]
[1] "" "" "" "" "" "" ""
Run Code Online (Sandbox Code Playgroud)

使用stringistringr包都是一样的.

> library(stringi)
> library(stringr)
> stri_extract_all_regex(x, '(?=([AC]C))')[[1]]
[1] "" "" "" "" "" "" ""
> str_extract_all(x, perl('(?=([AC]C))'))[[1]]
[1] "" "" "" "" "" "" ""
Run Code Online (Sandbox Code Playgroud)

执行此操作时应返回的正确结果是:

[1] "AC" "CC" "AC" "CC" "AC" "CC" "AC"
Run Code Online (Sandbox Code Playgroud)

编辑

  1. 我很清楚,regmatches对于捕获的匹配不能很好地工作,但是在regmatches中究竟什么导致了这种行为?为什么没有返回结果?我正在寻找一个有点详细的答案.

  2. stringistringr包不能够执行这种过度的regmatches

  3. 请随意添加我的答案或提出一个不同于我找到的解决方法.

hwn*_*wnd 7

就解决方法而言,这就是我提出的用于提取重叠匹配的内容.

> x <- 'ACCACCACCAC'
> m <- gregexpr('(?=([AC]C))', x, perl=T)
> mapply(function(X) substr(x, X, X+1), m[[1]])
[1] "AC" "CC" "AC" "CC" "AC" "CC" "AC"
Run Code Online (Sandbox Code Playgroud)

请随意添加或评论更好的方法来执行此任务.


MrF*_*ick 6

该标准regmatches不适用于捕获的匹配(特别是在同一字符串中的多个捕获的匹配).在这种情况下,由于您"匹配"前瞻(忽略捕获),因此匹配本身为零长度.还有一个regmatches()<-功能可以说明这一点.Obseerve

x <- 'ACCACCACCAC'
m <- gregexpr('(?=([AC]C))', x, perl=T)
regmatches(x, m) <- "~"
x
# [1] "~A~CC~A~CC~A~CC~AC"
Run Code Online (Sandbox Code Playgroud)

注意如何保留所有字母,我们只是用我们可以观察到的东西替换了零长度匹配的位置.

我创建了一个regcapturedmatches()函数,我经常用它来完成这些任务.例如

x <- 'ACCACCACCAC'
regcapturedmatches(x, gregexpr('(?=([AC]C))', x, perl=T))[[1]]

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,] "AC" "CC" "AC" "CC" "AC" "CC" "AC"
Run Code Online (Sandbox Code Playgroud)

gregexpr被抓的所有数据就好了,所以你可以,如果你不喜欢使用这个辅助函数从该对象无论如何提取它,你的生活.


gag*_*ews 5

一个stringi利用先行一部分的捕捉组的解决方案:

> stri_match_all_regex('ACCACCACCAC', '(?=([AC]C))')[[1]][,2]
## [1] "AC" "CC" "AC" "CC" "AC" "CC" "AC"    
Run Code Online (Sandbox Code Playgroud)