我需要使用正则表达式和匹配
找到恰好两个元音的单词这就是我所拥有的:
.*[aAeEiIoOuU].*[aAeEiIoOuU]
问题是它还给了我三个或更多元音的单词,我只想要两个。感谢。
答案 0 :(得分:2)
您可以使用gregexpr
ss <- c("one", "two", "three", "hundred", "thousand");
ss[lengths(gregexpr("[aeiou]", ss)) == 2];
#[1] "one" "three" "hundred"
或使用strsplit
:
ss <- c("one", "two", "three", "hundred", "thousand");
# Number of vowels
nv <- lapply(sapply(tolower(ss), strsplit, ""), function(x)
sum(x %in% c("a", "e", "i", "o", "u")))
ss[nv == 2];
#[1] "one" "three" "hundred"
答案 1 :(得分:1)
的 find words only containing two vowels
强> 的
这是一个非常好的方法。
\b[^\WaAeEiIoOuU]*[aAeEiIoOuU][^\WaAeEiIoOuU]*[aAeEiIoOuU][^\WaAeEiIoOuU]*\b
解释
\b # Boundry start
[^\WaAeEiIoOuU]* # Words, not vowels (optional)
[aAeEiIoOuU] # Vowel 1 (req'd)
[^\WaAeEiIoOuU]* # Words, not vowels (optional)
[aAeEiIoOuU] # Vowel 2 (req'd)
[^\WaAeEiIoOuU]* # Words, not vowels (optional)
\b # Boundry end
答案 2 :(得分:1)
你可以表达为:&#34;可能是一些辅音,然后是一个元音,然后可能是一些辅音,然后是一个元音,然后可能是一些辅音&#34;。
^[^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$
所以你可以这样做:
grepl("^[^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*$", s, ignore.case=TRUE)
或者,稍短:
grepl("^[^aeiou]*([aeiou][^aeiou]*){2}$", s, ignore.case=TRUE)
答案 3 :(得分:0)
我相信你现在允许任意数量的任何字符,然后是元音,后跟任意数量的任何字符,然后是元音。请考虑以下事项:
popopo可以分解为:[pop] - anything
[o] - a vowel
[p] - anything
[o] - a vowel
希望能帮助你解决问题。
答案 4 :(得分:0)
尝试包stringi
。函数stri_count_regex
在这里可以提供帮助,即
library(stringi)
x <- c('dfgsirys', 'fsggofasef', 'sdfgdgidga')
stri_count_regex(x, '[aAeEiIoOuU]')
#[1] 1 3 2
#or
stri_count_regex(x, '[aAeEiIoOuU]') == 2
#[1] FALSE FALSE TRUE
#or
x[stri_count_regex(x, '[aAeEiIoOuU]') == 2]
#[1] "sdfgdgidga"
答案 5 :(得分:0)
在基础r中,使用gregexpr
,您可以搜索单个元音,然后将其过滤为具有两个匹配项的字符串:
> ss <- c("one", "two", "three", "hundred", "thousand");
> gregexpr("[aeiou]", ss)
[[1]]
[1] 1 3
attr(,"match.length")
[1] 1 1
attr(,"useBytes")
[1] TRUE
[[2]]
[1] 3
attr(,"match.length")
[1] 1
attr(,"useBytes")
[1] TRUE
所以要找到具有两个元音的那些元素,找到所有长度为2的答案,并将子集ss指向该元素 -
> ss[ vapply(gregexpr("[aeiou]", ss), length, 0L) == 2 ]