让我们说我想找到所有的字母和#34; e"出现两次。当我定义这种模式时:
pattern1 <- "e.*e"
grep(pattern1, stringr::words, value = T)
RegEx还匹配&#34;因此&#34;等词语,因为&#34; e&#34;出现(至少)两次。关键是,我不希望我的模式至少是&#34;我希望它是&#34;恰好n次&#34;。
这种模式......
pattern2 <- "e{2}"
...找到带有两个字母&#34; e&#34;的单词,但前提是它们一个接一个地出现(&#34;感觉&#34;,&#34; agre&#34;等等)。我希望将这两种模式结合起来,找到具有确切数字的所有单词,不一定是连续出现的字母&#34; e&#34;。
答案 0 :(得分:2)
我们可以使用一种模式匹配零个或多个不是&#39; e&#39; ([^e]*
)从字符串的开头(^
)开始,然后是字符&#39; e&#39;,然后是另一组不是&#39; e&#39;其次是&#39; e,零个或多个字符不是&#39; e&#39;直到字符串
$
)
res <- grep("^[^e]*e[^e]*e[^e]*$", stringr::words, value = TRUE)
stringr::str_count(res, "e")
#[1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
#[58] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
#[115] 2 2 2 2 2 2 2
答案 1 :(得分:2)
您可以使用:
^(?:[^e]*e){2}[^e]*$
请参阅regex demo。 (?:...)
是一个非捕获组,允许量化子模式的序列,因此可以轻松调整以匹配字符串中的3,4或更多特定序列。
<强>详情
^
- 字符串开头(?:[^e]*e){2}
- 2次出现
[^e]*
- 除e
e
- e
[^e]*
- 除e
$
- 字符串结尾请参阅R demo below:
x <- c("feel", "agre", "degree")
rx <- "^(?:[^e]*e){2}[^e]*$"
grep(rx, x, value = TRUE)
## => [1] "feel"
请注意,代替value = T
使用value = TRUE
更安全,因为T
可能会在上面的代码中重新定义。
答案 2 :(得分:1)
^ [^ E] * E [^ E] E [^ E] $
^ asserts ::字符串的开头
[^ e] * ::匹配列表中不存在的零个或多个字符
*(星号) - 在零和无限次之间匹配,尽可能多次
e ::匹配字符e(区分大小写)
重复[^ e] *以匹配所有其他字符,如果在2 e之间
$断言字符串末尾的位置,或者在字符串末尾的行终止符之前(如果有的话)
所以,[^ e] *匹配除e,零或多次以外的所有字符。因此,如果字符串仅包含e,则条件也满足,因为它考虑所有其他字符的零出现。
答案 3 :(得分:1)
如果你没有不使用grep
stringr::str_count(words, "e") == 2
如果您想提高效率,
stringi::stri_count_fixed(words, "e") == 2
这两个都返回逻辑向量,您可以使用words[..code from above..]
答案 4 :(得分:0)