正则表达式只找到包含两个元音的单词

时间:2018-03-14 00:10:44

标签: r regex

我需要使用正则表达式和匹配

找到恰好两个元音的单词

这就是我所拥有的:

.*[aAeEiIoOuU].*[aAeEiIoOuU]

问题是它还给了我三个或更多元音的单词,我只想要两个。感谢。

6 个答案:

答案 0 :(得分:2)

方法1

您可以使用gregexpr

ss <- c("one", "two", "three", "hundred", "thousand");

ss[lengths(gregexpr("[aeiou]", ss)) == 2];
#[1] "one"     "three"   "hundred"

方法2

或使用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 ]