You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用代码从指定字符向量中提取|分隔的中间字符串

提取字符向量中两个竖线之间的子串

首先定义目标字符向量:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:55:59