You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何提取字符串指定模式所有匹配位置并统计匹配次数

R中提取字符串所有模式匹配位置与匹配次数的实现

stringr包的str_locate()函数设计上仅返回每个输入字符串的第一个匹配结果,要获取全部匹配项,直接使用同包的str_locate_all()函数即可,该函数返回与输入向量等长的列表,每个列表元素存储对应字符串所有匹配的起止坐标矩阵,基于这个结果可以一次性实现你需要的两个需求。


完整实现代码

library(stringr)

# 测试数据集构造(和提供的生成逻辑一致)
set.seed(999)
col_list <- lapply(1:10, function(x) sample.int(5, 200, replace = TRUE))
d <- data.frame(
  id = 1:10,
  seq = sapply(col_list, paste, collapse = "")
)

# 定义匹配模式
pattern <- "11"
# 获取所有匹配结果
match_res <- str_locate_all(d$seq, pattern = pattern)

# 逐行统计总匹配次数
d$match_total <- sapply(match_res, nrow)

# 逐行记录所有匹配的起始位置(这里存为逗号分隔的字符串,需要列表格式直接赋值match_res即可)
d$match_positions <- sapply(match_res, function(mat) {
  if (nrow(mat) == 0) return(NA_character_)
  paste(mat[, "start"], collapse = ",")
})

补充说明

  • 返回的match_res列表中,每个元素为两列矩阵:start列存储对应匹配的起始索引,end列存储对应匹配的结束索引,对于长度为2的模式"11",所有匹配的end值均为start + 1。
  • 当对应字符串无匹配项时,矩阵行数为0,此时匹配次数返回0,位置返回NA,符合常规统计逻辑。
  • 如果需要识别重叠匹配(例如字符串"111"中,"11"实际存在位置1、位置2两个重叠匹配,str_locate_all默认仅返回位置1的非重叠匹配),可以通过滑动窗口逻辑自定义实现:
# 重叠匹配统计函数
overlap_match <- function(s, pat) {
  s_len <- nchar(s)
  pat_len <- nchar(pat)
  if (s_len < pat_len) return(data.frame(start = integer(0), end = integer(0)))
  all_start <- seq(1, s_len - pat_len + 1)
  is_match <- sapply(all_start, function(i) substr(s, i, i + pat_len - 1) == pat)
  data.frame(start = all_start[is_match], end = all_start[is_match] + pat_len - 1)
}

# 批量计算重叠匹配结果
overlap_res <- lapply(d$seq, overlap_match, pat = pattern)
d$overlap_match_total <- sapply(overlap_res, nrow)
d$overlap_match_pos <- sapply(overlap_res, function(mat) {
  if (nrow(mat) == 0) return(NA_character_)
  paste(mat$start, collapse = ",")
})

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:39:28