如果字母重复出现,是否可以在字符串中删除字母?
例如,假设我有字符串aaardvark
,我想删除其中一个a
,我该怎么做?
答案 0 :(得分:3)
如果我正确理解了您的问题,您可以使用正则表达式执行此操作:
import re
re.sub(r'(.)\1+', r'\1', 'aardvarrk')
这会将所有相同字符的序列合并为一个,为您提供'ardvark'
。
至于拼写检查程序的实现,我建议在字典中“折叠”所有具有重复字符的单词,并将其保存在字典(数据结构)中,其中键是折叠的单词,值为原始单词(或可能是原始单词的set
):
{
'aple': 'apple',
'acord': 'accord'
'halo': set(['hallo', 'halo'])
}
现在,当您分析输入时,每个单词:
检查您的正确单词列表中是否存在。如果是,请忽略它。 (例如:输入为'person'
。它在单词列表中。这里没什么可做的。)
如果没有,请“折叠”它并查看是否:
'computerr'
变为'computer'
。现在您只需将其替换为列表中的原始字词。)'aaapppleee'
成为'aple'
。现在,您在单词列表中查找'aple'
。它不存在。现在在字典中查找键'aple'
。如果是那里。用它的值'apple'
替换它。)我用这种方法看到的唯一问题是两个有效的单词可能会“折叠”到同一个“单词”中。这意味着您必须使用set
作为您的价值。
说'hallo'
和'halo'
都是有效字词,用户输入'halloo'
。现在你必须决定要替换哪一个。这可以通过计算输入和可能的替换之间的Levenshtein distance来完成。
答案 1 :(得分:0)
这是一个解决方案,允许您使用重复字母的不同组合迭代字符串的所有版本:
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找到匹配的原始方法一致。
答案 2 :(得分:0)
这是使用标准库中的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"]