Отбрасывание письма, если оно повторяется - PullRequest
0 голосов
/ 18 октября 2011

Есть ли способ добавить букву в строку, если она повторяется?

Например, скажем, у меня есть строка aaardvark, и я хотел бы удалить одно из начала a, как бы я это сделал?

Ответы [ 3 ]

3 голосов
/ 18 октября 2011

Если я правильно понял ваш вопрос, вы можете сделать это с помощью регулярных выражений:

import re
re.sub(r'(.)\1+', r'\1', 'aardvarrk')

Это сворачивает все последовательности одинаковых символов в один, давая вам 'ardvark'.

какдля реализации вашей программы проверки орфографии я предлагаю «сворачивать» все слова, в последовательности которых есть повторяющиеся символы в вашем словаре, и сохранять их в словаре (структура данных), где ключ - это свернутое слово, а значение - исходное слово (или, возможно, set оригинальных слов):

{
 'aple': 'apple',
 'acord': 'accord'
 'halo': set(['hallo', 'halo'])
}

Теперь, когда вы анализируете ввод, для каждого слова:

  1. Проверьте, существует ли оно в вашем спискеправильных слов.Если это так, игнорируйте это.(например: input - 'person'. Он находится в списке слов. Здесь делать нечего).

  2. Если этого не произойдет, «сверните» его и посмотрите, если:

    1. Он существует в вашем списке слов.Если это так, замените его.(Например: 'computerr' становится 'computer'. Теперь вы просто замените его на оригинальное слово в вашем списке).
    2. Ключ существует в вашем словаре.Если это так, замените его словом, связанным с этим ключом.(например: 'aaapppleee' становиться 'aple'. Теперь вы ищите 'aple' в своем списке слов. Его там нет. Теперь поищите в вашем словаре ключ 'aple'. Если он там есть. Замените его значением,'apple'.)

Единственная проблема, с которой я сталкиваюсь при таком подходе, - это два допустимых слова, возможно, «сворачивающихся» в одно и то же «слово».Это означает, что вы должны будете использовать set в качестве значения.

Скажите, 'hallo' и 'halo' являются допустимыми словами, и пользователь вводит 'halloo'.Теперь вам нужно решить, какой из них заменить.Это можно сделать, рассчитав расстояние Левенштейна между входом и возможными заменами.

0 голосов
/ 18 октября 2011

Это совершенно другой подход с использованием difflib из стандартной библиотеки:

import difflib

words = open('/usr/share/dict/words').read().split()

difflib.get_close_matches('aaaappplllee', words, 3, 0.5)
['appalled', 'apple', 'appellate']

difflib.get_close_matches('aaardvarrk', words, 3, 0.5)
['aardvark', 'aardvarks', "aardvark's"]
0 голосов
/ 18 октября 2011

Вот решение, которое позволит вам перебирать все версии строки с различными комбинациями повторяющихся букв:

from itertools import product, groupby

# groups == ['aaaa', 'ppp', 'lll', 'ee']
groups = [''.join(g) for c, g in groupby('aaaappplllee')]

# lengths is an iterator that will return all combinations of string lengths to  
# use for each group, starting with [4, 3, 3, 2] and ending with [1, 1, 1, 1]
lengths = product(*[range(x, 0, -1) for x in map(len, groups)])

# Using the lengths from the previous line, this is a generator that yields all
# combinations of the original string with duplicate letters removed
words = (''.join(groups[i][:v] for i, v in enumerate(x)) for x in lengths)

>>> for word in words:
...   print word
... 
aaaappplllee
aaaapppllle
aaaapppllee
aaaappplle
aaaappplee
aaaappple
...
apple
aplllee
apllle
apllee
aplle
aplee
aple

Это не самое эффективное решение для поиска правильного слова, но оносогласуется с оригинальным методом OP для нахождения соответствия.

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