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

R语言拆分含不同长度元素名与数值的化合物字符串并插入下划线

代码修正方案

1. 下划线插入逻辑修正

你原有正则的问题有两个:

  • 回顾匹配仅包含小写字母和数字,单大写字母开头的元素(比如V)后接数值时无法触发插入,导致元素和数值连写
  • 未区分数字后接的是数字还是元素首字母,导致连续数值段被错误插入下划线拆分

修正后的正则直接匹配两类需要插入下划线的边界即可:

elem = gsub("(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Z])", "_", elem, perl = TRUE)

测试验证:输入原始字符串V1.0Co1.0Cu1.0Fe1.05Nb0.56Ni1.0,处理后输出正好符合你要求的格式V_1.0_Co_1.0_Cu_1.0_Fe_1.05_Nb_0.56_Ni_1.0。

2. 元素合法性校验与报错实现

你需要先定义合法元素符号的集合,拆分处理后的字符串提取元素段校验,不存在就按要求抛出错误:

# 可自行补全元素周期表中所有合法元素符号
valid_elements <- c("H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "V", "Co", "Cu", "Fe", "Nb", "Ni")

# 拆分字符串提取元素段
parts <- strsplit(elem, "_")[[1]]
element_list <- parts[seq(1, length(parts), 2)]
invalid_elements <- element_list[!element_list %in% valid_elements]

# 存在非法元素则抛出指定格式报错
if (length(invalid_elements) > 0) {
  err_desc <- sapply(invalid_elements, function(x) {
    if (nchar(x) == 1) {
      sprintf("'%s' (单字母元素,不存在于元素周期表中)", x)
    } else {
      sprintf("'%s'", x)
    }
  })
  stop(sprintf("Error: Element %s in compound %s entered does not exist!", 
               paste(err_desc, collapse = ", "), elem))
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:30:00