如何在字符串向量中识别双词通用非字母数字分隔符并实现函数?
提取字符串向量中的通用非字母数字分隔符
我们可以编写一个R函数,专门处理这类由两段字母数字组成、中间用统一非字母数字分隔符连接的字符串向量,精准提取所有元素共用的分隔符。
函数实现
find_common_separator <- function(str_vec) { # 提取每个字符串中夹在两段字母数字之间的非字母数字分隔符 separators <- stringr::str_extract(str_vec, "(?<=^[[:alnum:]]+)[^[:alnum:]]+(?=[[:alnum:]]+$)") # 检查是否存在不符合格式的字符串 if (any(is.na(separators))) { stop("部分字符串不符合「字母数字+分隔符+字母数字」的格式") } # 确认所有元素使用的是同一种分隔符 common_sep <- unique(separators) if (length(common_sep) != 1) { stop("向量中存在多种分隔符,无通用分隔符") } return(common_sep) }
函数逻辑说明
- 使用
stringr::str_extract结合正则前后断言,精准匹配夹在两段字母数字之间的非字母数字内容,确保只提取中间的分隔符。 - 先校验输入格式:如果有字符串无法提取到符合要求的分隔符,直接抛出错误提示。
- 再校验分隔符的统一性:如果提取到多种分隔符,同样抛出错误;唯一的分隔符即为通用分隔符。
测试案例
# 测试first向量 first <- c("L2DF.L2DA", "L2G.L2DA", "L2L.L2DA", "L2M.L2DA", "L2P.L2DA", "L2V.L2DA", "L2G.L2DF", "L2L.L2DF", "L2M.L2DF", "L2P.L2DF", "L2V.L2DF", "L2L.L2G", "L2M.L2G", "L2P.L2G", "L2M.L2L", "L2P.L2L", "L2P.L2M", "L2R.L2DA", "L2R.L2DF", "L2R.L2G", "L2R.L2L", "L2R.L2M", "L2R.L2P", "L2V.L2R", "L2V.L2G", "L2V.L2L", "L2V.L2M", "L2V.L2P") find_common_separator(first) # 输出:[1] "." # 测试second向量 second <- c("L2DF_L2DA", "L2G_L2DA", "L2L_L2DA", "L2M_L2DA", "L2P_L2DA", "L2V_L2DA", "L2G_L2DF", "L2L_L2DF", "L2M_L2DF", "L2P_L2DF", "L2V_L2DF", "L2L_L2G", "L2M_L2G", "L2P_L2G", "L2M_L2L", "L2P_L2L", "L2P_L2M", "L2R_L2DA", "L2R_L2DF", "L2R_L2G", "L2R_L2L", "L2R_L2M", "L2R_L2P", "L2V_L2R", "L2V_L2G", "L2V_L2L", "L2V_L2M", "L2V_L2P") find_common_separator(second) # 输出:[1] "_"
注意事项
- 函数默认输入向量的每个元素都严格遵循「字母数字段+非字母数字分隔符+字母数字段」的格式,且每个元素仅有一个分隔符。
- 若输入不符合上述规则,函数会抛出明确的错误提示,便于排查问题。
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

