从具有随机模式的字符串中提取值

问题描述 投票:0回答:2

如何使用模式从字符串向量中提取

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')
r string tidyverse
2个回答
1
投票

另一种没有

regex
的替代方案:

> basename(strings)|>
    strsplit("_")|>
    sapply("[", 1)
[1] "1.10E+93" "1.10E+93" "1012055"  "1012055"  "1018598"  "AOL"      "WDF985" 

0
投票

有很多方法可以做到这一点(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]”的要求非常有用

© www.soinside.com 2019 - 2024. All rights reserved.