R中重复的子串

时间:2014-08-09 12:38:07

标签: regex r

所以,我正在通过以下链接查看问题: Finding repeated substrings with R

发布的答案非常好,但我有疑问,如果字符串是

"111111111111"

然后输出

[1] "1111" "111"  "11"  

因为," 11"和" 111"包含在" 1111"不会那两个是多余的,怎么能克服这个?我的魔杖只是" 1111"此外,我从该问题中理解的是,代码必须输出最大长度的重复字符串。 考虑另一个例子:

"101110110110110"

预期输出为:

"110" "101" "011" 

1 个答案:

答案 0 :(得分:1)

对于经典模式,正则表达式引擎不能在同一位置多次匹配相同的字符。

使用字符abcde的示例abc|bcd模式只会为您提供一个结果(abc)但不能为bcd提供第二个匹配,因为bc abc 1}}已经是第一个匹配结果的一部分。换句话说,您无法获得重叠匹配结果,因为在第二次尝试时,字符串中正则表达式引擎的位置是在第一个匹配(在abcde之后)之后。

对于某些重要的事情,如果将所有模式放在先行断言(并且如果使用捕获组来获取某些内容),则可以通过技巧获得重叠结果。这个技巧使用了前瞻不匹配的事实,它只是对当前正则表达式引擎位置的测试,但没有什么不允许将捕获组放入其中。

(?=(abc|bcd))a的示例:模式在b位置和abc位置成功,但两个完整匹配结果将为空,但是您将获得的第一个捕获组bcd(?=(abc|abcd))

但是,始终无法从字符串中的相同位置获取多个结果,因为正则表达式引擎每次获得结果时都会前进到下一个字符(或者根本不获取任何内容)。

如果使用相同的字符串测试此模式abc,则只能在捕获组中获取s <- '111111111111' m <- gregexpr('(?=(.{2,})\\1{2,})', s, perl=TRUE) unique(mapply(function(x, y) substr(s, x, x+y-1), attr(m[[1]], 'capture.start'), attr(m[[1]], 'capture.length'))) 。再一次,相同的位置无法测试两次。

关于您的具体示例

这是测试代码:

s

模式的目标是找到长度大于1个字符且重复次数超过1次的子字符串,重复的子字符串必须是连续的。

{{1}}包含十二个字符。如上所述,正则表达式引擎将在每个位置测试整个模式。由于量词在默认情况下是贪婪的,因此您将获得每个位置的最长结果。

结果:

  • 职位捕获论坛预测整个匹配
  • character 1:1111:1111 1111 1111
  • character 2:111:111 111 111
  • character 3:111:111 111 111
  • character 4:111:111 111 111
  • character 5:11:11 11 11 11
  • character 6:11:11 11 11
  • character 7:11:11 11 11

模式成功七次。代码的第二部分仅删除重复项。