求助:在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
相关产品推荐
相关产品推荐

