匹配所有可能子串的另一个列表中的子串

时间:2017-07-19 09:15:10

标签: r grep

我有一个很长的字符串向量,其中包含市场名称和其他内容

S = c('123_GOLD_534', '531_SILVER_dfds', '93_COPPER_29dad', '452_GOLD_deww')

另一个向量包含所有可能的市场

V = c('GOLD','SILVER')

如何从S中提取市场名称位?基本上我想循环遍历VS,如果S[j]V[i]替换为grepl(V[i], S[j])

所以结果看起来应该是

c('GOLD','SILVER',NA,'GOLD')

1 个答案:

答案 0 :(得分:3)

您可以使用stringr中的str_extract

> library(stringr)
> str_extract(S, paste(V, collapse="|"))
[1] "GOLD"   "SILVER" NA       "GOLD"  

paste(V, collapse="|")会创建一个像GOLD|SILVER这样的正则表达式,从而会提取GOLDSILVER。如果正则表达式不匹配,则只返回NA。

请注意,如果您仅在GOLD符号附近时才需要匹配SILVER_,请将paste(V, collapse="|")替换为paste0("(?<=_)(?:", paste(V, collapse="|"), ")(?=_)")

> str_extract(S, paste0("(?<=_)(?:", paste(V, collapse="|"), ")(?=_)"))
[1] "GOLD"   "SILVER" NA       "GOLD"  

它会创建一个像(?<=_)(?:GOLD|SILVER)(?=_)这样的正则表达式,如果前面有一个GOLDSILVER,只有_,只会匹配(?<=_)_并且如果值之后有(?=_)(由于$plan正前瞻)。 Lookaheads不会在匹配中添加匹配的文本(它们非消费)。