Как удалить повторяющиеся фразы в Python? - PullRequest
0 голосов
/ 07 ноября 2018

Предположим, у меня есть строка, такая как

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

1 Ответ

0 голосов
/ 07 ноября 2018

Спасибо всем за ваши попытки и комментарии. Я наконец нашел решение:

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)

заменяет такие вхождения первым многократным набором буквенно-цифровых символов, разделенных одним или двумя [любым символом], при этом обязательно игнорируйте регистр (поскольку дублирующая фраза может иногда встречаться в начале предложения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...