我有一个很长的字符串向量,其中包含市场名称和其他内容
S = c('123_GOLD_534', '531_SILVER_dfds', '93_COPPER_29dad', '452_GOLD_deww')
另一个向量包含所有可能的市场
V = c('GOLD','SILVER')
如何从S中提取市场名称位?基本上我想循环遍历V
和S
,如果S[j]
将V[i]
替换为grepl(V[i], S[j])
。
所以结果看起来应该是
c('GOLD','SILVER',NA,'GOLD')
答案 0 :(得分:3)
您可以使用stringr中的str_extract
:
> library(stringr)
> str_extract(S, paste(V, collapse="|"))
[1] "GOLD" "SILVER" NA "GOLD"
paste(V, collapse="|")
会创建一个像GOLD|SILVER
这样的正则表达式,从而会提取GOLD
或SILVER
。如果正则表达式不匹配,则只返回NA。
请注意,如果您仅在GOLD
符号附近时才需要匹配SILVER
或_
,请将paste(V, collapse="|")
替换为paste0("(?<=_)(?:", paste(V, collapse="|"), ")(?=_)")
:
> str_extract(S, paste0("(?<=_)(?:", paste(V, collapse="|"), ")(?=_)"))
[1] "GOLD" "SILVER" NA "GOLD"
它会创建一个像(?<=_)(?:GOLD|SILVER)(?=_)
这样的正则表达式,如果前面有一个GOLD
(SILVER
,只有_
,只会匹配(?<=_)
或_
并且如果值之后有(?=_)
(由于$plan
正前瞻)。 Lookaheads不会在匹配中添加匹配的文本(它们非消费)。