Вам необходимо протестировать все соседние перестановки с 1 (каждое отдельное слово) на len (текст) (вся строка). Вы можете сгенерировать Сосед Перестановки таким образом:
text = 'I have a smartphone and a Smart TV'
array = text.lower().split()
key_permutations = [" ".join(array[j:j + i]) for i in range(1, len(array) + 1) for j in range(0, len(array) - (i - 1))]
>>> key_permutations
['i', 'have', 'a', 'smartphone', 'and', 'a', 'smart', 'tv', 'i have', 'have a', 'a smartphone', 'smartphone and', 'and a', 'a smart', 'smart tv', 'i have a', 'have a smartphone', 'a smartphone and', 'smartphone and a', 'and a smart', 'a smart tv', 'i have a smartphone', 'have a smartphone and', 'a smartphone and a', 'smartphone and a smart', 'and a smart tv', 'i have a smartphone and', 'have a smartphone and a', 'a smartphone and a smart', 'smartphone and a smart tv', 'i have a smartphone and a', 'have a smartphone and a smart', 'a smartphone and a smart tv', 'i have a smartphone and a smart', 'have a smartphone and a smart tv', 'i have a smartphone and a smart tv']
Теперь подставим по словарю:
import re
for permutation in key_permutations:
if permutation in dict:
text = re.sub(re.escape(permutation), dict[permutation], text, flags=re.IGNORECASE)
>>> text
'I have a toy and a junk'
Хотя вы, вероятно, хотите попробовать перестановки в обратном порядке, самый длинный первый, так еще определенные фразы имеют приоритет над отдельными словами.
Ключ имеет пространство, поэтому вы не можете разбить –
строка replace не сработает, если у dict есть что-то вроде этого my_dict = {"google": "yahoo", "yahoo": "google"} и текст "google больше yahoo" –