R:在字符数组中查找特定数量的字符

时间:2012-07-27 01:19:43

标签: r grep

我想在名称中找到正好有两个Os的状态。我试过这个:

> data(state)
> index=grep('o.*o',state.name)
> state.name[index]
"Colorado"       "North Carolina" "North Dakota"   "South Carolina" "South Dakota"   

问题:“科罗拉多”中有三个Os,我不想要它。我怎样才能修改我的正则表达式?

我也想做三个Os:

> data(state)  
> index=grep('o.*o.*o',state.name)  
> state.name[index]
"Colorado"  

有更简单的方法吗?

5 个答案:

答案 0 :(得分:3)

你可以这样做:

grep('^([^o]*o[^o]*){2}$', state.name, value = TRUE)
# [1] "North Carolina" "North Dakota"
# [3] "South Carolina" "South Dakota"

grep('^([^o]*o[^o]*){3}$', state.name, value = TRUE)
# [1] "Colorado"

并且如下面的GSee建议,如果您想要包含像俄亥俄州,俄克拉荷马州和俄勒冈州这样的大写字母O的州,则可以添加ignore.case = TRUE

答案 1 :(得分:2)

迈克尔的回答肯定更有说服力,但这是蛮力方法:

state.name[sapply(strsplit(tolower(state.name), NULL), function(x) sum(x %in% "o") == 2)]

答案 2 :(得分:1)

除了两个匹配的Os之外,你应该确保你匹配的其他字符不是Os:

grep("^[^o]*o[^o]*o[^o]*$", state.name, value = TRUE)

答案 3 :(得分:0)

使用?gregexpr的解决方案:有点难看,但很好地推广到其他正则表达式。 (不要忘记俄亥俄州的首都O.)

state.name[sapply(state.name,function(x) length(unlist(gregexpr("o|O",x)))) == 2]

答案 4 :(得分:0)

计算州名的操作数。

State <- c("North Dakota","Ohio","Colorado","South Dakota")
nos <- nchar(gsub("[^oO]","",State))
State[nos==2]
State[nos==3]