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

R 提取可能字符列表右侧的所有字符,r,string,extract,R,String,Extract,我在数据帧中有一系列字符串,如下所示: item_time<-c("pink dress july noon", "shirt early september morning", "purple dress april", "tall purple shoes february") 我不能用空格来分隔它们,因为时间和项目列表中的单词数量不同。我也没有一个符号来区分它们。我觉得应该有一个非常简单和优雅的方法来解决这个问题,但我想不出来 您可以使用sub和正则表达式来执行此操作 Pat =

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

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

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

您可以使用
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)(.*)"

中间部分(.*)(粉色连衣裙、衬衫、紫色连衣裙、高高的紫色鞋子)匹配任何一种图案。第一个
(.*)
匹配图案之前的任何图案。第二个
(.*))
匹配模式后的任何内容。
sub
语句随后将整个字符串替换为模式匹配后的部分。

您可以使用
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)(.*)"

中间部分
“(.*)(粉色连衣裙|衬衫|紫色连衣裙|高高的紫色鞋子)
与您的任何一种图案匹配。第一个
(.*)
匹配模式之前的任何内容。第二个
(.*)
匹配模式后面的任何内容。然后,
sub
语句将整个字符串替换为模式匹配后的部分

另一种方法是使用mapply

mapply(gsub,pattern=item,replacement='',x=item_time)
如果您还想删除
项目
项目_时间
右侧部分之间的空格,您可以改为使用:

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

另一种方法是使用mapply

mapply(gsub,pattern=item,replacement='',x=item_time)
如果您还想删除
项目
项目_时间
右侧部分之间的空格,您可以改为使用:

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

这里是另一个使用
stringr::str_replace(string,pattern,replacement)
的选项,它的优点是它在
string
pattern
上都是矢量化的(以及
replacement

trimws
删除前导空格


请注意,这需要
item\u time
item
具有成对匹配的条目。

这里是另一个使用
stringr::str\u replace(string,pattern,replacement)
的选项,它的优点是在
string
pattern
(以及
replacement
)上进行矢量化

trimws
删除前导空格


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

可以简化为:
Pat=paste0(“*”,paste0(item,collapse=“|”)和“)\\s+”;sub(Pat,“,item_time)
我收到一条错误消息,“模式和替换向量必须相同长度”…谢谢!我不明白那个错误。哪条语句给了您这个错误?sub(Pat,\\3,item_time)
DT=data。table(time=sub(Pat,\\2,item_time))
可以简化为:
Pat=paste0(“*”,paste0(item,collapse=“”)\\s+”;sub(Pat,“,item_time)
我收到一条错误消息,“模式和替换向量必须相同长度”…谢谢!我不明白那个错误。哪个语句给了你这个错误?sub(Pat,“\\3”,item_time)
DT=data.table(time=sub(Pat,“\\2”,item_time))
或者
trimws(mapply(gsub,item',,item_time,fixed=TRUE))
或者
trimws(mappy(gsub,item',item_time,fixed=TRUE))