r语言 - 用于可变长度的正则表达式



我正在寻找一个正则表达式或另一个命令/解决方案,以从数百种化学品的非常大的列表中提取所有pkA值。到目前为止,我已经成功地从列表的一个子集中提取了所需的pkA值。

我想知道是否也有可能提取包含pkAs的整行?我想,因为他们都有相当可比的长度,你可以提取这些正则表达式,但我不知道如何实现正则表达式内的长度与包含pkA值的特定行组合?我想知道这一点的原因是因为我的正则表达式不包括以0开头的pka。像这样的化学物质并不常见,但它们确实存在。通过提取整行,我还将捕获给出温度值的少数条目,而正则表达式不包括这些条目。

下面是一个(希望)最小的工作示例,其中包含我的列表的摘录。

library(stringr)
list_pkas <- structure(list(Chemical = c("MCPA", "Aspirin"), pka = c("3.2.13Dissociation ConstantsrnpKa= 3.13rnCessna AJ, Grover R; J Agric Food Chem 26: 289-92(1978)rnHazardous Substances Data Bank (HSDB)", 
"3.2.14Dissociation ConstantsrnAcidic pKarn3.47rnTested as SID 103164874 in AID 781325: https://pubchem.ncbi.nlm.nih.gov/bioassay/781325#sid=103164874rnComparison of the accuracy of experimental and predicted pKa values of basic and acidic compounds. Pharm Res. 2014; 31(4):1082-95. DOI:10.1007/s11095-013-1232-z. PMID:24249037rnChEMBLrnAcidic pKarn3.5rnTested as SID 103164874 in AID 781326: https://pubchem.ncbi.nlm.nih.gov/bioassay/781326#sid=103164874rnComparison of the accuracy of experimental and predicted pKa values of basic and acidic compounds. Pharm Res. 2014; 31(4):1082-95. DOI:10.1007/s11095-013-1232-z. PMID:24249037rnChEMBL; DrugBankrnpKa = 3.49 at 25 °CrnO'Neil, M.J. (ed.). The Merck Index - An Encyclopedia of Chemicals, Drugs, and Biologicals. Whitehouse Station, NJ: Merck and Co., Inc., 2006., p. 140rnHazardous Substances Data Bank (HSDB)"
)), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"
))
string <- list_pkas$pka[2]
string_sub <- str_sub(string, 7)
pkas <- str_extract_all(string_sub, "([1-9]\.[0-9]{1,2})")

MCPA的预期输出应该是:

3.13

pKa=3.13

对阿司匹林:

3.47
3.5
pKa = 3.49 at 25 °C

任何帮助都非常感谢!

您可以使用后面的断言(?<=foo):

str_extract_all(list_pkas$pka, "(?<=pKa\D{0,5})\d.*")
# [[1]]
# [1] "3.13"
# 
# [[2]]
# [1] "3.47"          "3.5"           "3.49 at 25 °C"

我认为这个表达式可以满足您的需要:

"pKa\D{0,5}((?:\s*\d+\.*\d*)(?:\s*at\s*\d+\s*.*?\w)*)"

最新更新