正则表达式匹配确切的字母数

时间:2017-10-25 09:09:25

标签: r regex string

让我们说我想找到所有的字母和#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;。

5 个答案:

答案 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
    • 以外的任何0 +字符
    • e - e
  • [^e]* - 除e
  • 以外的任何0 +字符
  • $ - 字符串结尾

请参阅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)

try这个(粗体是匹配的):

\b[^e\s]*e[^e\s]*e[^e\s]*\b
  

因此

     

因此

     

平均

     

     

meme

     

你好

     

hellee

     

<强>饸饹

     

ee

     

EEE