如何在 Python 中找到重复的字符串段?

How can I find repeated string segments in Python?

所以我有一些中等长度的字符串 - 介于几个单词和几个句子之间。有时,文本中的一个子串会连续重复两次。我需要编写自动代码来识别重复的部分。或者至少以高概率标记它。

我知道的:

  1. 重复的子串是一系列的几个完整的单词(和标点符号)。单词中间不会出现重复。
  2. 重复的长度是可变的。它可以是几个词到几个句子本身。但它总是至少有几个字那么长。如果可能,我想避免标记单个单词重复。
  3. 当发生重复时,它总是恰好重复一次,并且紧接在上一次出现之后。就在上次出现之后。 (<- 例子)
  4. 我需要 运行 对大约一百万个不同的字符串进行此检查,因此代码至少必须具有一定的效率(不是蛮力检查每个选项的方法)。

我已经为此苦苦挣扎了一段时间。非常感谢您的帮助。

因为一个词的重复是multiple-word[=52=的子类 ] 重复,匹配单个单词或 word-like 序列已经很有帮助了。这是我在 editor with regex search:

中尝试解决您的问题的正则表达式
(\<\w.{3,16}\w\>).{2,}

这是发现的第一个重复

The repeat is of a variable length. It can be a few words to a few sentences itself. But it's always at least a few words long. I would like to avoid flagging single word repetitions if possible.

但它接下来会在 repeating 中找到 repeat。所以我们必须调整限制。

部分(\<\w.{3,16}\w\>)表示

  • 从单词开始(包括一个字符)
  • 3到16个任意字符
  • 单词结束前(包括一个字符)

换句话说,一个或多个总字符数为 5 到 18 的单词。

部分.{2,}表示

  • 至少两个字符
  • 无上限
  • 捕获的比赛

在这里,下限可以更高。应该尝试使用上限,尤其是在较长的文本上。

我认为首先要找到重复的短字符序列,然后通过寻找在第一步结果中重复的较长序列(加上末尾的其他字符)来改进。

也是预处理的问题。我猜想如果换行符(而不是 space 发生在不同的地方),应该错过重复的 multiple-word 序列。

要进一步自动化,您可以切换到 Python's re module