【问题标题】:Finding repetitive substrings寻找重复的子串
【发布时间】:2013-08-31 18:04:35
【问题描述】:

有一些任意字符串,例如

hello hello hello I am I am I am your string string string string of strings

我能否以某种方式找到重复的子字符串由空格分隔(编辑)?在这种情况下,它将是“你好”、“我是”和“字符串”。

我一直在想这个问题,但我仍然找不到任何真正的解决方案。 我也阅读了一些关于这个主题的文章并找到了后缀树,但这可以帮助我,即使我需要找到每一个重复,例如重复次数高于两次?

如果是这样,是否有一些python库可以处理后缀树并对它们执行操作?

编辑:很抱歉我不够清楚。所以为了清楚起见 - 我正在寻找重复的子字符串,这意味着字符串中的序列,例如,就正则表达式而言,可以用 + 或 {} 通配符代替。所以如果我必须从列出的字符串中制作正则表达式,我会这样做

(hello ){3}(I am ){3}your (string ){4}of strings 

【问题讨论】:

  • 我是这么认为的。在发布此问题之前,我实际上已经阅读了该问题,但我没有想出任何想法,如何将解决方案转换为适合我的问题。
  • 没错,我只关注我真正想要的输出。对此感到抱歉。
  • 不确定您的意思是否类似于this,结果在命名组“结果”中。当然of strings 不见了……
  • @Hyperboreus m I a 不是重复的子字符串由空格分隔

标签: python regex repeat


【解决方案1】:

要查找重复两次或多次的两个或多个字符,每个字符由空格分隔,请使用:

(.{2,}?)(?:\s+\1)+

这是一个使用您的测试字符串的工作示例:http://bit.ly/17cKX62

编辑:通过添加使捕获组中的量词不情愿?匹配最短可能匹配(即现在匹配“字符串”而不是“字符串字符串”)

编辑 2:为更清晰的结果添加了所需的空格分隔符

【讨论】:

  • 适用于他的情况,但我会让 .{2,} 非贪婪,否则它将匹配 "a a a b" 中的 "a a "。
  • 对。事实上,它匹配的是“string string”,而不是“string”
  • 哇,像魔术一样工作!在我接受你的回答之前,你介意解释一下正则表达式吗?我理解为什么我们有 (.{2,}?),但是下面的括号? "?:" 表示不记得了,\s+ 足够清楚,但是 \1 ?这是否是说“把你从第一组找到的东西再找一遍?”
  • (?: ...) 是一个非捕获组。就像 (...) 一样,除了匹配不被记住或访问。在这种情况下, (?:...) 或 (...) 都可以,但出于习惯,如果我不需要捕获它们,我总是让组不捕获。第一组 (.{2,}?) 被捕获,并且对它的反向引用 (\1) 确保只有重复的字符串被匹配。这是关于组和捕获和反向引用的教程:regular-expressions.info/brackets.html
猜你喜欢
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
相关资源
最近更新 更多