R 将字符串从目标字符串的开头提取为字符

R 将字符串从目标字符串的开头提取为字符,r,regex,string,R,Regex,String,我有一个目标字符串: Target_string <- "aaa" Target\u string我建议将lappy()与strsplit()一起使用,然后连接结果。您必须创建一个列表来保存匹配结果。此外,可以在lappy()中定义的函数内使用grepl()检查匹配。最后,您可以使用do.call()收集所有结果,使用c()函数在L列表上创建一个向量: #Data Target_string <- "aaa" String <- c(&

我有一个目标字符串:

Target_string <- "aaa"

Target\u string我建议将
lappy()
strsplit()
一起使用,然后连接结果。您必须创建一个列表来保存匹配结果。此外,可以在
lappy()
中定义的函数内使用
grepl()
检查匹配。最后,您可以使用
do.call()
收集所有结果,使用
c()
函数在
L
列表上创建一个向量:

#Data
Target_string <- "aaa"
String <- c("bb|aaa_123|ccc","aaa234|bbb|NA|NA","bbb|ccc|aaab452|ddd|NA|NA")
#Split and check
L <- lapply(strsplit(String,split='|', fixed=TRUE),function(x) x[grepl(pattern = Target_string,x = x)])
#Bind
do.call(c,L)

使用
str\u extract

stringr::str_extract(String, paste0(Target_string, '.*?(?=\\|)'))
#[1] "aaa_123" "aaa234"  "aaab452"
其中,要提取的模式为:

paste0(Target_string, '.*?(?=\\|)')
#[1] "aaa.*?(?=\\|)"

在base R中,您可以通过以下方式执行此操作:

sub(paste0('.*(', Target_string, '.*?)\\|.*'), '\\1', String)
这里的模式是:

paste0('.*(', Target_string, '.*?)\\|.*')
#[1] ".*(aaa.*?)\\|.*"

aaa[^ |]*
要匹配0+倍除管道以外的任何字符,这非常有用。感谢Ronak,这非常有用。我需要花更多的时间理解正则表达式的语法!
paste0(Target_string, '.*?(?=\\|)')
#[1] "aaa.*?(?=\\|)"
sub(paste0('.*(', Target_string, '.*?)\\|.*'), '\\1', String)
paste0('.*(', Target_string, '.*?)\\|.*')
#[1] ".*(aaa.*?)\\|.*"