我已经搜索,并且能够找到这个
forum discussion,以达到重叠比赛的效果.
我还发现了以下SO问题,提到查找索引来执行此任务,但是无法找到任何简明扼要的R语言中的重叠匹配.
我可以在大多数支持(PCRE)的任何语言中执行此任务,通过使用正向前置断言,同时在前瞻性内部实现捕获组以捕获重叠的匹配.
但是,实际执行方式和其他语言一样,在R中使用perl = T,没有结果产生.
> x <- 'ACCACCACCAC' > regmatches(x,gregexpr('(?=([AC]C))',x,perl=T))[[1]] [1] "" "" "" "" "" "" ""
同样适用于使用stringi和stringr包.
> library(stringi) > library(stringr) > stri_extract_all_regex(x,'(?=([AC]C))')[[1]] [1] "" "" "" "" "" "" "" > str_extract_all(x,perl('(?=([AC]C))'))[[1]] [1] "" "" "" "" "" "" ""
执行此操作时应返回的正确结果如下:
[1] "AC" "CC" "AC" "CC" "AC" "CC" "AC"
编辑
>我很清楚,对于捕获的比赛来说,regmatches不能很好地工作,但究竟是什么原因导致了这种行为,为什么还没有返回任何结果?我清醒一些有些详细的答案.
> stringi和stringr包是否不能执行这个超过regmatches?
>请随意添加到我的答案或提出一个不同于我发现的解决方法.
捕获的匹配(特别是同一字符串中的多个捕获的匹配)的标准规则不能正常工作.而在这种情况下,由于您是“匹配”前瞻(忽略捕获),所以匹配本身是零长度的.还有一个可以说明这一点的regmatches()< - 函数. Obseerve
x <- 'ACCACCACCAC' m <- gregexpr('(?=([AC]C))',perl=T) regmatches(x,m) <- "~" x # [1] "~A~CC~A~CC~A~CC~AC"
注意所有的字母是否被保留,我们只是用可以观察到的零长度匹配的位置替换.
我创建了一个我经常用于这样的任务的regcapturedmatches()功能.例如
x <- 'ACCACCACCAC' regcapturedmatches(x,perl=T))[[1]] # [,1] [,2] [,3] [,4] [,5] [,6] [,7] # [1,] "AC" "CC" "AC" "CC" "AC" "CC" "AC"