正则表达式以精确匹配R中任意数量的字符
我想使用regex计算连续出现的字符数。假设模式为正则表达式以精确匹配R中任意数量的字符,r,regex,R,Regex,我想使用regex计算连续出现的字符数。假设模式为“aa”和“bbb”,即“a”发生的次数正好连续两次“b”精确地连续出现三次(它们可以由任何字符前后限定,除了字符本身之外,不包括任何内容)。如果测试向量为 c("baa", "aaaa", "aab", "aa", "bbba", "bbaabbb") 计数结果应如下所示: 与“aa”匹配的模式为c(“baa”、“aab”
“aa”
和“bbb”
,即“a”
发生的次数正好连续两次<代码>“b”精确地连续出现三次(它们可以由任何字符前后限定,除了字符本身之外,不包括任何内容)。如果测试向量为
c("baa", "aaaa", "aab", "aa", "bbba", "bbaabbb")
计数结果应如下所示:
与“aa”
匹配的模式为c(“baa”、“aab”、“aa”、“bbaabbb”)
&
匹配“bbb”
的模式是c(“bbba”,“bbaabbb”)
我使用了“\\”
,但它并没有给出我想要的结果。如果您能提供任何帮助,我将不胜感激。若要匹配恰好出现两次的字符“a”,您可以使用负向后看与负向前看相结合的方法。也就是说,你在寻找一个
- 不跟在字符“a”后面
- 包含字符串“aa”和
- 后面不跟“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"
grep((?我们也可以拆分并获得表
table(unlist(lapply(strsplit(v1, "(?<=b)(?=a)|(?<=a)(?=b)", perl =TRUE),
function(x) x[x %in% c('aa', 'bbb')])))
# aa bbb
# 4 2
表(未列出(lapply)(strsplit(v1,)(?请共享您用于测试的代码。是否绝对要使用regex
package?因为您可以使用stringr
package执行此操作。vec@Smich,我知道stringr。它将无法忽略任何条件,即它可以在任何字符之前和之后绑定,除了字符本身之外,不包含任何内容。regex I这是我认为可以做到的唯一方法。这不是假设字符串只包含字母“a”和“b”吗?这种方法与“caa”
不匹配,是吗?对不起,我不是有意抨击你的答案。我认为strsplit
非常优雅。我只是想知道这种方法是否能抓住“aa”
字符串中的“caa”
(…它们可以由任何字符前后绑定,除了字符本身之外,不包括任何内容)是的,Ikop它不仅包含a&b。感谢您Akrun的努力,此外,我不确定这种方法是否可靠。如果我想检查长度1到10,我必须实际键入我想要的所有模式,例如“aa”、“aaa”、“aaaa”,…但通过Ikop的方法,我可以很容易地组合循环和长度函数,以了解a或b的1,2,3,…出现次数。也许如果您可以使其更易于概括而不是具体化。@tundeawo关于您的注释,table(unlist(lappy)(strsplit(v2)”(?
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")