正则表达式,返回特定字母后面的数字,直到下一个字母
发布时间:2020-12-14 06:04:30 所属栏目:百科 来源:网络整理
导读:我需要一个正则表达式,返回一个特定的字母和下面的(一个或两个)数字,直到下一个字母. 例如,我想在R中使用正则表达式提取公式中有多少个碳(C) strings - c("C16H4ClNO2","CH8O","F2Ni") 我需要一个表达式,它返回C的数字,可以是一个或两个数字,并且在氯(Cl)之
我需要一个正则表达式,返回一个特定的字母和下面的(一个或两个)数字,直到下一个字母.
例如,我想在R中使用正则表达式提取公式中有多少个碳(C) strings <- c("C16H4ClNO2","CH8O","F2Ni") 我需要一个表达式,它返回C的数字,可以是一个或两个数字,并且在氯(Cl)之后不返回数字. substr(strings,regexpr("C[0-9]+",strings) + 1,regexpr("[ABDEFGHIJKLMNOPQRSTUVWXYZ]+",strings) -1) [1] "16" "C" "" 但我想要回答的答案是 "16","1","0" 此外,我希望正则表达式自动定位下一个字母并在它之前停止,而不是具有我指定为不是C的字母的最终位置. 解决方法
CHNOSZ包中的化妆将解析化学式.以下是一些使用它的替代方案:
1)创建一个这样完全解析的公式的列表L,然后为每个公式检查它是否具有“C”组件并返回其值,如果没有则返回0: library(CHNOSZ) L <- Map(makeup,strings) sapply(L,function(x) if ("C" %in% names(x)) x[["C"]] else 0) ## C16H4ClNO2 CH8O F2Ni ## 16 1 0 请注意,如果您有其他要求,L是完全解析的公式的列表: > L $C16H4ClNO2 C H Cl N O 16 4 1 1 2 $CH8O C H O 1 8 1 $F2Ni F Ni 2 1 1a)通过向每个列表组件添加c(C = 0),我们可以避免必须测试碳的存在,从而产生以下(1)中的sapply线的较短版本: sapply(lapply(L,c,c(C = 0)),"[[","C") 2)除了名称之外,(1)的这种单线变化给出了与(1)中相同的答案.它为每个配方添加“C0”以避免必须测试碳的存在: sapply(lapply(paste0(strings,"C0"),makeup),"C") ## [1] 16 1 0 2a)这是(2)的变体,通过使用化妆将接受矩阵的事实来消除lapply: sapply(makeup(as.matrix(paste0(strings,"C0"))),"C") ## [1] 16 1 0 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |