如何在R中按字符拆分字符串且不忽略尾随分隔符?
问题:保留分隔符首尾空值的字符串拆分方法
我有如下字符串:
my_string <- "apple,banana,orange,"
希望按,拆分后得到包含末尾空值的结果:
list(c('apple', 'banana', 'orange', ""))
但使用基础的strsplit()会忽略末尾的逗号,输出不符合预期:
my_string <- "apple,banana,orange," strsplit(my_string, split = ',') #> [[1]] #> [1] "apple" "banana" "orange"
测试用例
需要支持多种边界场景,包括首尾带分隔符、任意分隔符的情况:
# 末尾带分隔符 string1 = "apple,banana,orange," output1 = list(c('apple', 'banana', 'orange', '')) # 无末尾分隔符 string2 = "apple,banana,orange,pear" output2 = list(c('apple', 'banana', 'orange', 'pear')) # 开头带分隔符 string3 = ",apple,banana,orange" output3 = list(c('', 'apple', 'banana', 'orange')) # 其他分隔符示例:| string4 = "|apple|banana|orange|" output4 = list(c('', 'apple', 'banana', 'orange', '')) # 其他分隔符示例:x string5 = "xapplexbananaxorangex" output5 = list(c('', 'apple', 'banana', 'orange', ''))
最简base-R解决方案
方法1:利用scan函数(最简洁)
scan函数默认会保留首尾的空值,只需指定分隔符即可实现需求,代码极简:
split_keep_empty <- function(x, sep) { list(scan(text = x, what = character(), sep = sep, quiet = TRUE)) } # 验证测试用例 split_keep_empty(string1, ",") #> [[1]] #> [1] "apple" "banana" "orange" "" split_keep_empty(string3, ",") #> [[1]] #> [1] "" "apple" "banana" "orange" split_keep_empty(string4, "|") #> [[1]] #> [1] "" "apple" "banana" "orange" ""
说明:what = character()指定读取字符类型,sep设置目标分隔符,quiet = TRUE关闭控制台读取提示,最后将结果包装成列表即可匹配预期输出格式。
方法2:strsplit结合正则表达式
如果偏好使用strsplit,可以通过正则正向预查实现,同时处理特殊分隔符的转义:
split_keep_empty <- function(x, sep) { # 对正则特殊字符(如|、.等)转义 escaped_sep <- gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", sep) # 用正向预查匹配分隔符的前后位置,避免消耗分隔符 parts <- strsplit(x, paste0("(?<=\\", escaped_sep, ")|(?=\\", escaped_sep, ")"), perl = TRUE)[[1]] # 过滤掉分隔符本身,保留内容 parts <- parts[parts != sep] # 处理开头/结尾的空值 if (startsWith(x, sep)) parts <- c("", parts) if (endsWith(x, sep)) parts <- c(parts, "") list(parts) } # 验证测试用例 split_keep_empty(string5, "x") #> [[1]] #> [1] "" "apple" "banana" "orange" ""
内容的提问来源于stack exchange,提问作者Selk
相关产品推荐
相关产品推荐

