如果模式是字符串字符,如何查找匹配?

时间:2015-11-16 00:19:00

标签: regex r grep agrep

假设我有一个字符串向量:

header = c("2012 Chevrolet Camaro SS", 
           "2013 Chevrolet Equinox LT", 
           "2013 Nissan Altima 2.5 SV", 
           "2009 Infiniti M35x X")

以及汽车制造商名单

maker.list = c("Chevrolet", "Nissan", "Infiniti")

我想使用agrep()返回汽车制造商在标题中每个元素中出现的位置的索引。我希望它返回

idx = c(2, 2, 2, 2) #the makers' name occurs at the 2nd position of each element 

由于模式是字符串列表,我想使用mapply或lapply来循环它。或者使用r命令将制造商名称更改为正则表达式,如

regexp = "Chevrolet|Nissan|Infiniti" 

到目前为止,我有:

idx = lapply(maker.list, function(permaker){
   match.result = agrep(permaker, header, max.distance = 1)
   return (match.result)
})

这显然不起作用......有什么想法吗?

-----------------------------更新----------------- --------------- 我尝试了下面的解决方案之一,发生了一些奇怪的事情。

maker.list1 = c("zap", "ford")
lapply(maker.list1, agrep, c("2011" ,"Ford", "Escape"), max.distance = 1, ignore.case = TRUE)

结果是

[[1]]
[1] 3

[[2]]
[1] 2
说这两个匹配,这对我没有意义,我错过了什么? ps:在我的实际案例中,我有大约70个汽车制造商和超过4k的标题。

1 个答案:

答案 0 :(得分:2)

strsplit header中的每个项目按空格排列,然后通过每个项目运行agrep

sapply(strsplit(header, "\\s+"), function(H) unlist(lapply(maker.list, agrep, H)) )
#[1] 2 2 2 2

如果您针对任何情况获得多次点击,则会得到list而不是矢量。