我在从 R 中的字符串中提取模式时遇到问题
我有一个包含路径的文件名列表,我需要从路径中提取一小部分名称以分配给另一个向量。我无法获得正确的模式定义来提取所需的部分。
这里是一些文件名的例子。我有一个 500+ 的列表,因此子函数需要是通用的。
files = c("G:\\Conservation\\Monitoring\\Conditions physico-chimiques\\CTD\\CODES_R\\Data\\CTD_parc_marin\\2009\\odf\\CTD_2009099_BSM2AMONT_1_DN.ODF",
"G:\\Conservation\\Monitoring\\Conditions physico-chimiques\\CTD\\CODES_R\\Data\\CTD_parc_marin\\2011\\odf\\CTD_2011PSSL_42_1_DN.ODF",
"G:\\Conservation\\Monitoring\\Conditions physico-chimiques\\CTD\\CODES_R\\Data\\CTD_parc_marin\\2011\\odf\\CTD_2011PSSL_10_1_DN.ODF",
"G:\\Conservation\\Monitoring\\Conditions physico-chimiques\\CTD\\CODES_R\\Data\\CTD_parc_marin\\2022\\odf\\CTD_2022PSSL_202201017ESTMARAVAL_1_DN.odf")
我要提取的模式是这些:
pattern = c("BSM2AMONT_1_DN",
"PSSL_42_1_DN",
"PSSL_10_1_DN",
"ESTMARAVAL_1_DN")
到目前为止,我有这个功能:
pattern <- sub(".*\\d{4,7}([A-Z]|\\d{9})(.*)\\.(ODF|odf)", "\\2", files)
这几乎完美地工作,除了最后一个例子,我得到“STMARAVAL_1_DN”而不是所需的“ESTMARAVAL_1_DN”。
感谢您的帮助!
sub(".*\\d{4,7}_?(?:([A-Z])|\\d{9})(.*)\\.(ODF|odf)", "\\1\\2", files)
# [1] "BSM2AMONT_1_DN" "PSSL_42_1_DN" "PSSL_10_1_DN" "ESTMARAVAL_1_DN"
我将
([A-Z]|\\d{9})
更改为 (?:([A-Z])|\\d{9})
:?:
表示不捕获反向引用,但随后我捕获了字母(将其添加回替换字符串 "\\1\\2"
)。我还在它之前添加了_?
以修复结果的第一个元素。