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

求助:在R中通过字符串操作识别模式(合并同类连续片段)

在R中合并连续重复的字符串片段

可以通过正则表达式或游程编码的方式,实现将字符串中连续重复的字母/数字片段合并为单个的需求,以下是两种实用方案:

方案1:正则反向引用快速处理

利用gsub()结合正则反向引用,直接匹配并替换连续重复的片段:

# 定义测试字符串向量
test_strings <- c(
  "#string-string-string-string-9999-9999",
  "#string-string-9999-9999-9999",
  "#string-9999",
  "#string-9999-string",
  "#string-string-string-string-9999-9999-string"
)

# 定义处理函数
collapse_dup_segments <- function(x) {
  # 匹配连续重复的片段并替换为单个
  gsub("((#?\\w+)-)\\1+", "\\1", x) |> 
    # 清理末尾可能残留的短横线
    gsub("-+$", "", .)
}

# 执行处理并输出结果
final_result <- collapse_dup_segments(test_strings)
print(final_result)

运行结果完全符合预期:

[1] "#string-9999"          "#string-9999"          "#string-9999"         
[4] "#string-9999-string"   "#string-9999-string"

方案2:分割后分组去重(逻辑更直观)

如果对正则不熟悉,可以先将字符串按短横线分割,再用游程编码提取连续重复元素的唯一值,最后重新拼接:

# 定义另一种处理函数
collapse_dup_segments_v2 <- function(x) {
  lapply(x, function(s) {
    # 分割字符串为片段列表
    segments <- strsplit(s, "-")[[1]]
    # 提取连续重复元素的唯一值
    unique_runs <- rle(segments)$values
    # 重新拼接为字符串
    paste(unique_runs, collapse = "-")
  }) |> unlist()
}

# 执行处理并输出结果
final_result_v2 <- collapse_dup_segments_v2(test_strings)
print(final_result_v2)

方案说明

  • 方案1的正则((#?\\w+)-)\\1+:
    • (#?\\w+)-匹配单个目标片段(包含可选的开头#,以及字母数字内容)
    • \\1+匹配该片段的连续重复项
    • 替换为\\1实现保留单个片段
  • 方案2的rle()函数是R内置的游程编码工具,能直接识别连续重复的元素组,逻辑清晰易懂,适合新手理解

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:03:30