【问题标题】:How to remove duplicate phrases in Python?如何在 Python 中删除重复的短语?
【发布时间】:2019-04-10 10:18:26
【问题描述】:

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

'I hate *some* kinds of duplicate. This string has a duplicate phrase, duplicate phrase.'

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

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

我找到了几篇关于类似问题的帖子,但没有一个可以帮助我解决我的特定问题:

我曾希望将最后一个链接 (re.sub(r'\b(.+)(\s+\1\b)+', r'\1', s)) 中的方法用于我的目的,但不知道该怎么做。

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

【问题讨论】:

  • 这些短语的大小是任意的吗?它们可以出现在文本的任何位置吗?
  • 例如,这个'aaa ccc bbb aaa ccc' 有重复的短语"aaa ccc",但要找出它,您必须遍历字符串中的所有短语。也许后缀树可以帮助更快。

标签: python regex python-2.7 replace


【解决方案1】:

感谢大家的尝试和 cmets。我终于找到了解决办法:

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.'

说明

正则表达式

r'((\b\w+\b.{1,2}\w+\b)+).+\1'

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

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

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

【讨论】:

  • 那么这个正则表达式是否只适用于第二句?
  • 我在问,因为它不适合这个:s = '我讨厌 some 种重复,重复。这个字符串有一个重复的短语,重复的短语。'
  • @Lifeiscomplex 您的评论揭示了我在回应对该问题的评论时所做的不准确陈述。我专门看 2+ 词的短语,所以我并不是要涵盖这种情况。稍后我将编辑问题和答案,以便将来的观众清楚这一点。
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多