我想使用 正则表达式 计算确切连续出现的字符数。让模式为"aa"
和"bbb"
,即"a"
出现的次数恰好两次连续; "b"
出现正好三次且连续(它们可以在任何字符之前和之后被限制,除了字符本身之外什么都没有)。如果测试向量是
c("baa", "aaaa", "aab", "aa", "bbba", "bbaabbb")
计数的结果应如下:
匹配"aa"
的模式为c("baa", "aab", "aa", "bbaabbb")
&
匹配"bbb"
的模式为c("bbba", "bbaabbb")
我使用了"\\<"
&amp; "\\>"
但它并没有给我我想要的结果。我将不胜感激。
答案 0 :(得分:6)
要匹配两次出现的字符“a”,可以使用负向lookbehind和负向前瞻。即,你寻找一个
的职位正则表达式为(?<!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")