Если я правильно понял ваш вопрос, вы можете сделать это с помощью регулярных выражений:
import re
re.sub(r'(.)\1+', r'\1', 'aardvarrk')
Это сворачивает все последовательности одинаковых символов в один, давая вам 'ardvark'
.
какдля реализации вашей программы проверки орфографии я предлагаю «сворачивать» все слова, в последовательности которых есть повторяющиеся символы в вашем словаре, и сохранять их в словаре (структура данных), где ключ - это свернутое слово, а значение - исходное слово (или, возможно, set
оригинальных слов):
{
'aple': 'apple',
'acord': 'accord'
'halo': set(['hallo', 'halo'])
}
Теперь, когда вы анализируете ввод, для каждого слова:
Проверьте, существует ли оно в вашем спискеправильных слов.Если это так, игнорируйте это.(например: input - 'person'
. Он находится в списке слов. Здесь делать нечего).
Если этого не произойдет, «сверните» его и посмотрите, если:
- Он существует в вашем списке слов.Если это так, замените его.(Например:
'computerr'
становится 'computer'
. Теперь вы просто замените его на оригинальное слово в вашем списке). - Ключ существует в вашем словаре.Если это так, замените его словом, связанным с этим ключом.(например:
'aaapppleee'
становиться 'aple'
. Теперь вы ищите 'aple'
в своем списке слов. Его там нет. Теперь поищите в вашем словаре ключ 'aple'
. Если он там есть. Замените его значением,'apple'
.)
Единственная проблема, с которой я сталкиваюсь при таком подходе, - это два допустимых слова, возможно, «сворачивающихся» в одно и то же «слово».Это означает, что вы должны будете использовать set
в качестве значения.
Скажите, 'hallo'
и 'halo'
являются допустимыми словами, и пользователь вводит 'halloo'
.Теперь вам нужно решить, какой из них заменить.Это можно сделать, рассчитав расстояние Левенштейна между входом и возможными заменами.