如何使用模式从字符串向量中提取
1.10E+93
、1012055
、1018598
、AOL
、WDF985
?我想提取两次 1.10E+93
和 1012055
以及一次其他值,即为每个字符串提取一个值。
strings <- c('/ccr/1.10E+93_ccrdt/indices/1.10E+93_ccr_ann_123.csv',
'/ccr/1.10E+93_ccrdt/indices/1.10E+93_obsrst_ann.csv',
'/ccr/1012055_obsrt/indices/1012055_obsrrt.csv',
'/ccr/1012055_obsrt/indices/1012055_ccr_ann.csv',
'/ccr/1018598_obsrt/indices/1018598_obsrrt.csv',
'/ccr/AOL_obsrt/indices/AOL_rrst.csv',
'/ccr/WDF985_obsrt/indices/WDF985_rrst.csv')
另一种没有
regex
的替代方案:
> basename(strings)|>
strsplit("_")|>
sapply("[", 1)
[1] "1.10E+93" "1.10E+93" "1012055" "1012055" "1018598" "AOL" "WDF985"
有很多方法可以做到这一点(Copilot 或 ChatGPT 可能会给你一个很好的答案。)也许你想要
strings |>
## remove everything up to the last slash
stringr::str_remove("^.*/") |>
## remove underscore and everything after it
stringr::str_remove("_.*$")
[1] "1.10E+93" "1.10E+93" "1012055" "1012055" "1018598" "AOL" "WDF985"
或者
stringr::str_extract(strings, "/([^/_]*)_", group = TRUE)
或(R基)
gsub("^.*/([^_]*)_.*$", "\\1", strings)
您也可以使用
stringr::str_extract()
。正则表达式的后向/先行组件对于“提取 [A] 和 [B] 之间的所有字符但在结果中不包括 [A] 或 [B]”的要求非常有用