我想在名称中找到正好有两个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"
有更简单的方法吗?
答案 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]