0

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

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

问题:“科罗拉多”中有三个操作系统,我不想要它。如何修改我的正则表达式?

我也想做三个Os:

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

有没有更简单的方法来做到这一点?

4

5 回答 5

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 下面建议的那样,ignore.case = TRUE如果您想包括大写为 O 的州,如俄亥俄州、俄克拉荷马州和俄勒冈州,您可以添加。

于 2012-07-27T02:01:46.843 回答
2

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

state.name[sapply(strsplit(tolower(state.name), NULL), function(x) sum(x %in% "o") == 2)]
于 2012-07-27T01:40:19.557 回答
1

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

grep("^[^o]*o[^o]*o[^o]*$", state.name, value = TRUE)
于 2012-07-27T01:24:17.887 回答
0

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

state.name[sapply(state.name,function(x) length(unlist(gregexpr("o|O",x)))) == 2]
于 2012-07-27T02:00:28.930 回答
0

计算状态名称中的操作系统数。

State <- c("North Dakota","Ohio","Colorado","South Dakota")
nos <- nchar(gsub("[^oO]","",State))
State[nos==2]
State[nos==3]
于 2012-07-27T10:08:15.540 回答