gpt4 book ai didi

返回特定字母后直到下一个字母的数字的正则表达式

转载 作者:行者123 更新时间:2023-12-04 10:53:29 25 4
gpt4 key购买 nike

我需要一个正则表达式,它返回一个特定的字母和以下(一个或两个)数字,直到下一个字母。
例如,我想使用 R 中的正则表达式提取公式中的碳数 (C)

strings <- c("C16H4ClNO2", "CH8O", "F2Ni")

我需要一个表达式来返回 C 的数量,它可以是一位或 2 位数字,并且不返回氯 (Cl) 之后的数字。
substr(strings,regexpr("C[0-9]+",strings) + 1, regexpr("[ABDEFGHIJKLMNOPQRSTUVWXYZ]+",strings) -1)
[1] "16" "C" ""

但我想被退回的答案是
"16","1","0"

此外,我希望正则表达式自动定位下一个字母并在它之前停止,而不是将最终位置指定为不是 C 的字母。

最佳答案

makeup在 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)对于每个列表组件,我们可以避免测试碳的存在,从而产生以下较短版本的 sapply (1) 中的行:
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通过使用 makeup 的事实将接受一个矩阵:
sapply(makeup(as.matrix(paste0(strings, "C0"))), "[[", "C")
## [1] 16 1 0

关于返回特定字母后直到下一个字母的数字的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42675761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com