如何在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.0AlFe0.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
相关产品推荐
相关产品推荐

