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

如何在R中拆分后跟数字的不同长度元素名称字符串并添加下划线

化合物名称拆分与校验解决方案

问题根因

你当前使用的正则(?<=[a-z0-9])(?=[0-9A-Z])存在两个核心缺陷:

  • 未覆盖大写字母后接数字的场景,导致V1.0这类单字母元素加占比的字符串无法拆分,元素与占比会连在一起
  • 命中数字后接数字的场景,导致1.05这类连续占比会被误拆为1.0_5

修正代码实现

1. 下划线插入逻辑修正

调整正则规则,仅在两类合法位置插入下划线:

  • 字母(无论大小写)后紧跟大写字母/数字的位置
  • 数字/小数点后紧跟大写字母的位置
    对应R代码如下:
# 你的化合物列表
compounds <- c(
  "Ag0.05Zr1.0",
  "Al0.11W1.0",
  "Al0.18Cr1.0",
  "AlFe",
  "AlFe0.2NiCuCoCr",
  "AlFe0.2NiCuCoCz",
  "AlFeNi",
  "AlFeNiCo",
  "AlFeNiCrCo",
  "AlFeNiCrCoCu0.2",
  "AlFeNiCu0.2CoCr",
  "Cr1.0Mo0.33",
  "U0.33Zr1.0",
  "V0.33W1.0",
  "V1.0W1.0"
)

# 插入下划线
processed <- gsub("(?<=[A-Za-z])(?=[A-Z0-9])|(?<=[0-9.])(?=[A-Z])", "_", compounds, perl = TRUE)

处理后输出示例:

  • V1.0W1.0 → V_1.0_W_1.0
  • AlFe0.2NiCuCoCz → Al_Fe_0.2_Ni_Cu_Co_Cz
  • 含连续占比的字符串Co1.0Cu1.0Fe1.05Nb0.56Ni1.0 → Co_1.0_Cu_1.0_Fe_1.05_Nb_0.56_Ni_1.0,完全符合预期。

2. 非法元素检测实现

先定义合法元素周期表列表,再提取每个化合物中的元素名做校验,不符合要求则输出指定格式的错误:

# 可根据需求补全所有元素周期表中的合法元素
valid_elements <- c("Ag", "Zr", "Al", "W", "Cr", "Fe", "Ni", "Cu", "Co", "Mo", "U", "V", "C")

for (i in seq_along(compounds)) {
  # 提取所有元素名(匹配大写字母开头+可选小写字母的规则)
  elems <- regmatches(compounds[i], gregexpr("[A-Z][a-z]?", compounds[i]))[[1]]
  # 校验合法性
  invalid <- setdiff(elems, valid_elements)
  if (length(invalid) > 0) {
    for (e in invalid) {
      cat(sprintf("Error: Element '%s' in compound %s entered does not exist!\n", e, compounds[i]))
    }
  }
}

运行后会输出指定格式的错误:

Error: Element 'Cz' in compound AlFe0.2NiCuCoCz entered does not exist!

内容的提问来源于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 07:00:05