如何删除 Python 中的重复短语?

duc*_*ayr 7 python regex replace python-2.7

假设我有一个字符串,例如

'I hate *some* kinds of duplicate. This string has a duplicate phrase, duplicate phrase.'
Run Code Online (Sandbox Code Playgroud)

我想删除第二次出现的 ,duplicate phrase而不删除其组成部分的其他出现,例如duplicate.

此外,我需要删除所有 潜在的重复短语,而不仅仅是我事先知道的某些特定短语的重复项。

我发现了几篇关于类似问题的帖子,但没有一个能帮助我解决我的特定问题:

我曾希望根据re.sub(r'\b(.+)(\s+\1\b)+', r'\1', s)我的目的调整最后一个链接 ( ) 中的方法,但无法弄清楚如何做到这一点。

如何从 Python 中的字符串中删除两个或多个单词的所有任意重复短语?

duc*_*ayr 5

感谢大家的尝试和评论。我终于找到了解决方案:

s = 'I hate *some* kinds of duplicate. This string has a duplicate phrase, duplicate phrase.'
re.sub(r'((\b\w+\b.{1,2}\w+\b)+).+\1', r'\1', s, flags = re.I)
# 'I hate *some* kinds of duplicate. This string has a duplicate phrase.'
Run Code Online (Sandbox Code Playgroud)

解释

正则表达式

r'((\b\w+\b.{1,2}\w+\b)+).+\1'
Run Code Online (Sandbox Code Playgroud)

查找由一个或两个 [任何字符] 分隔的多次运行的字母数字字符的每次出现(以涵盖单词不仅由空格分隔,而且可能由句点或逗号和空格分隔的情况),然后在某些运行后重复长度不确定的[任何字符]。然后

re.sub(r'((\b\w+\b.{1,2}\w+\b)+).+\1', r'\1', s, flags = re.I)
Run Code Online (Sandbox Code Playgroud)

将此类事件替换为由一个或两个 [任何字符] 分隔的第一组字母数字字符,并确保忽略大小写(因为重复的短语有时可能出现在句子的开头)。

  • 我问,因为它对此不起作用: s = '我讨厌*某些*类型的重复,重复。该字符串有一个重复的短语,重复的短语。 (3认同)