提取可能字符列表右侧的所有字符

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

我在数据框中有一系列字符串,如下所示:

item_time<-c("pink dress july noon", "shirt early september morning", "purple dress 
april", "tall purple shoes february")

我想提取所有可能字符列表右侧的字符,如下所示:

item<-c("pink dress","shirt","purple dress", "tall purple shoes")

我想要的结果看起来像这样:

[1] july noon
[2] early september morning
[3] april
[4] february

我不能用空格分隔它们,因为时间和项目列表中有不同数量的单词。我也没有分隔它们的符号。我觉得应该有一个非常简单而优雅的方法来解决这个问题,但我无法弄明白。

r string extract
3个回答
1
投票

您可以使用sub和正则表达式执行此操作。

Pat = paste0("(.*)(", paste0(item, collapse="|"), ")(.*)")
sub(Pat, "\\3", item_time)
[1] " july noon"               " early september morning"
[3] " april"                   " february"  

详细信息:创建的模式是:

Pat
[1] "(.*)(pink dress|shirt|purple dress|tall purple shoes)(.*)"

中间部分"(.*)(pink dress|shirt|purple dress|tall purple shoes) matche4s你的任何一个模式。第一个(.*)匹配模式之前的任何东西。第二个(.*)匹配模式之后的任何东西。然后sub语句用模式匹配后的部分替换整个字符串。


1
投票

另一种方法是使用mapply

mapply(gsub,pattern=item,replacement='',x=item_time)

如果你还想删除itemitem_time右边部分之间的空格,你可以使用:

mapply(gsub,pattern=paste0(item,' '),replacement='',x=item_time)

0
投票

这是使用stringr::str_replace(string, pattern, replacement)的另一种选择,它的优点是它可以在stringpattern(以及replacement)上进行矢量化。

trimws(stringr::str_replace(item_time, item, ""))
#[1] "july noon"               "early september morning"
#[3] "april"                   "february"

trimws删除了领先的空白。

请注意,这需要item_timeitem具有成对匹配条目。

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