求助:如何用代码从指定字符向量中提取|分隔的中间字符串
提取字符向量中两个竖线之间的子串
首先定义目标字符向量:
vec <- c("tr|A0A075F5C6|A0A075F5C64_MORGAN", "sp|AC087WPF7|AUTS2_MORGAN", "tr|A0A087WPU4|CCC087WPU4_MORGAN", "tr|DAA08W8RK1|A0A087WRK1_MORGAN", "tr|A0A087WRT4|AFW0987WRT4_MORGAN", "tr|A0A087WSP5|A0A087WSP5_MORGAN")
方法1:使用stringr包(tidyverse生态)
利用正则正向预查定位两个竖线之间的内容,str_extract直接提取匹配项:
library(stringr) result <- str_extract(vec, "(?<=\\|).*?(?=\\|)") print(result) # 输出:[1] "A0A075F5C6" "AC087WPF7" "A0A087WPU4" "DAA08W8RK1" "A0A087WRT4" "A0A087WSP5"
正则说明:(?<=\\|)匹配前置竖线(不捕获内容),.*?非贪婪匹配任意字符,(?=\\|)匹配后置竖线(不捕获内容),精准锁定中间子串。
方法2:Base R原生实现(无需额外包)
用regmatches配合regexpr完成提取:
result <- regmatches(vec, regexpr("(?<=\\|)[^|]+", vec, perl = TRUE)) print(result)
正则说明:(?<=\\|)匹配前置竖线,[^|]+匹配所有非竖线字符(直到下一个竖线为止),执行效率更高。
方法3:拆分后取元素(逻辑直观)
用strsplit按竖线拆分每个字符串,再提取第二个元素:
split_list <- strsplit(vec, "\\|") result <- sapply(split_list, function(x) x[2]) print(result)
这种方式无需编写正则,适合对正则不熟悉的场景,逻辑简单直白。
内容的提问来源于stack exchange,提问作者Shaxi Liver
相关产品推荐
相关产品推荐

