【问题标题】:Finding the consecutive vowels using regex使用正则表达式查找连续的元音
【发布时间】:2014-03-28 02:18:51
【问题描述】:

我有以下代码来查找连续元音,但它没有给我正确的结果: **我的代码错了吗?

sapply(v, function(x){ gsub(".*[0-9]\\s", "", grep("[aeiou]{2}", x, value = TRUE, invert = FALSE)) })

其中v是:

c("Joe 4311 rsfuvgcozbxwlnnfevze", "Clayton 2414 qsncnpvdfpjmvmvbdvce", 
"Addison 25 melmasilbgrurqbezgyu", "Donovan 2013 gozagvswtitjjinrzgup", 
"Sage 540 aamyvegiadwjwpvwtjko", "Zavier 133 cyomwtxftslukvmvpmcl", 
"Maria 1241 ngqjynxnpblcztnlkack", "Mercedes 2400 xcwbxxljspneilwejutw", 
"Micheal 4400 oovhyodyubhqwzdcwybf", "Brylee 2532 sarbmelbeycrnhytbout", 
"Giancarlo 3351 xmocyljxquklbchgmdcj", "Elin 5513 nbjovdtmijpfluzixebu", 
"Ray 2553 snrqrzshlzmmhumzlecl", "Jade 4030 rhibewstyrwdervgqnru", 
"Amelia 5205 lcnvnjhamhzavdfosmae", "Karissa 2030 vhvzyfckgogduqqayzku", 
"Conor 325 sbgfntjejbtwsvidvtnu", "Tripp 454 xmvuhycjnvqgnmorfdrl", 
"River 5120 zcxavkwzhwbvdqadajgh", "Tianna 251 mwoqwzyfddhuunmtiioh", 
"Conner 3543 ngyuzdbeyizfarxuxntz", "Mackenzie 3113 yvycqaquwtfjjtqsdduh", 
"Melody 4422 buagtfiaipniavdnsxhv", "Dallas 5343 blyjvtlpvpqondrdhluu")

在 v 中,每一行都有“NAME SCORES WORD”的形式,我们想找出 WORD 中有多少行有两个连续的元音?

【问题讨论】:

    标签: regex r sapply


    【解决方案1】:

    如果您先strsplit 文字,您可以更轻松地应用grep

    v[grep("[aeiou]{2}",sapply(strsplit(v," "),"[",3))]
    
    #[1] "Sage 540 aamyvegiadwjwpvwtjko"     
    #[2] "Mercedes 2400 xcwbxxljspneilwejutw"
    #[3] "Micheal 4400 oovhyodyubhqwzdcwybf" 
    #[4] "Brylee 2532 sarbmelbeycrnhytbout"  
    #[5] "Amelia 5205 lcnvnjhamhzavdfosmae"  
    #[6] "Tianna 251 mwoqwzyfddhuunmtiioh"   
    #[7] "Melody 4422 buagtfiaipniavdnsxhv"  
    #[8] "Dallas 5343 blyjvtlpvpqondrdhluu"  
    

    【讨论】:

    • 非常好。看来我每晚都从你身上学到一些东西。
    【解决方案2】:

    以下是一次性完成的方法。我们可以使用这个正则表达式跳过 WORD 之前的所有内容,并在最后一部分中查找连续的元音。

    > (zz <- do.call(rbind, lapply(v, function(x){ 
          grep("^.*[0-9]\\s.*[aeiou]{2}", x, value = TRUE)
          })))
         [,1]                                
    [1,] "Sage 540 aamyvegiadwjwpvwtjko"     
    [2,] "Mercedes 2400 xcwbxxljspneilwejutw"
    [3,] "Micheal 4400 oovhyodyubhqwzdcwybf" 
    [4,] "Brylee 2532 sarbmelbeycrnhytbout"  
    [5,] "Amelia 5205 lcnvnjhamhzavdfosmae"  
    [6,] "Tianna 251 mwoqwzyfddhuunmtiioh"   
    [7,] "Melody 4422 buagtfiaipniavdnsxhv"  
    [8,] "Dallas 5343 blyjvtlpvpqondrdhluu"  
    > length(zz)
    [1] 8
    

    【讨论】:

    • 比较你的解决方案和我的解决方案,你能告诉我哪里出了问题吗?
    • 我认为将它们都包含在sapply 中,在这种情况下,也可以捕获 NAME 中的连续元音。将它们分开解决了它,因为它首先切断了前两个部分。那样好像更安全。
    • 是的,作为一个例子,它在名字中捕获了乔。谢谢解释
    • 找出问题所在。我们根本不需要gsub。请查看编辑
    • gsub("[^0-9]", "", v)
    【解决方案3】:

    我认为,如果你把三个变量都设定好,你的生活会轻松很多 (姓名、分数、单词)显式:

    library(stringr)
    df <- as.data.frame(str_split_fixed(v, " ", 3))
    names(df) <- c("name", "score", "word")
    

    然后提取匹配是一个简单的子集:

    subset(df, str_detect(word, "[aeiou]{2}"))
    
    ##        name score                 word
    ## 5      Sage   540 aamyvegiadwjwpvwtjko
    ## 8  Mercedes  2400 xcwbxxljspneilwejutw
    ## 9   Micheal  4400 oovhyodyubhqwzdcwybf
    ## 10   Brylee  2532 sarbmelbeycrnhytbout
    ## 15   Amelia  5205 lcnvnjhamhzavdfosmae
    ## 20   Tianna   251 mwoqwzyfddhuunmtiioh
    ## 23   Melody  4422 buagtfiaipniavdnsxhv
    ## 24   Dallas  5343 blyjvtlpvpqondrdhluu
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多