正则表达式匹配R中的任意数量的字符

时间:2017-05-02 09:20:40

标签: r regex

我想使用 正则表达式 计算确切连续出现的字符数。让模式为"aa""bbb",即"a"出现的次数恰好两次连续; "b"出现正好三次且连续(它们可以在任何字符之前和之后被限制,除了字符本身之外什么都没有)。如果测试向量是

c("baa", "aaaa", "aab", "aa", "bbba", "bbaabbb")

计数的结果应如下:

enter image description here

匹配"aa"的模式为c("baa", "aab", "aa", "bbaabbb")&

匹配"bbb"的模式为c("bbba", "bbaabbb")

我使用了"\\<"&amp; "\\>"但它并没有给我我想要的结果。我将不胜感激。

2 个答案:

答案 0 :(得分:6)

要匹配两次出现的字符“a”,可以使用负向lookbehind和负向前瞻。即,你寻找一个

的职位
  • 不会跟随字符“a”,
  • 包含字符串“aa”和
  • 后面没有“a”

正则表达式为(?<!a)a{2}(?!a)

示例:

test <- c("baa", "aaaa", "aab", "aa", "bbba", "bbaabbb")
grep("(?<!a)a{2}(?!a)", test, perl = TRUE, value = TRUE)
# [1] "baa"     "aab"     "aa"      "bbaabbb"

匹配正好发生三次的字符“b”类似地完成:

grep("(?<!b)b{3}(?!b)", test, perl = TRUE, value = TRUE)
# [1] "bbba"    "bbaabbb"

答案 1 :(得分:0)

我们也可以拆分并获取table

 table(unlist(lapply(strsplit(v1, "(?<=b)(?=a)|(?<=a)(?=b)", perl =TRUE), 
            function(x) x[x %in% c('aa', 'bbb')])))
 # aa bbb 
 # 4   2 

如果还有其他字符,

table(unlist(lapply(strsplit(v2, "(?<=[^a])(?=a)|(?<=a)(?!a)",
         perl = TRUE), function(x) x[x %in% c('aa', 'bbb')])))
# aa bbb 
#  5   2 

数据

v1 <- c("baa", "aaaa", "aab", "aa", "bbba", "bbaabbb")
v2 <- c("baa", "aaaa", "aab", "aa", "bbba", "bbaabbb", "caa")