【问题标题】:R: finding specific numbers of characters in a character arrayR:在字符数组中查找特定数量的字符
【发布时间】:2012-07-27 01:19:42
【问题描述】:

我想找到名称中正好有两个 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"  

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

【问题讨论】:

    标签: r regex


    【解决方案1】:

    你可以这样做:

    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

    【讨论】:

    • 我总是忘记value = TRUE。 +1
    • +1。正如@user1547166 指出的那样,OP 可能希望包含以大写“O”开头的状态,在这种情况下,您可以在grep 调用中使用ignore.case=TRUE
    • 我喜欢这很容易推广到任何数量的操作系统。 +1
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-08-06
            • 1970-01-01
            • 2022-12-02
            • 1970-01-01
            • 2018-08-29
            • 2023-01-23
            • 2014-04-10
            相关资源
            最近更新 更多