如果重复,请丢弃一封信

时间:2011-10-17 21:55:11

标签: python string

如果字母重复出现,是否可以在字符串中删除字母?

例如,假设我有字符串aaardvark,我想删除其中一个a,我该怎么做?

3 个答案:

答案 0 :(得分:3)

如果我正确理解了您的问题,您可以使用正则表达式执行此操作:

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

这会将所有相同字符的序列合并为一个,为您提供'ardvark'

至于拼写检查程序的实现,我建议在字典中“折叠”所有具有重复字符的单词,并将其保存在字典(数据结构)中,其中键是折叠的单词,值为原始单词(或可能是原始单词的set):

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

现在,当您分析输入时,每个单词:

  1. 检查您的正确单词列表中是否存在。如果是,请忽略它。 (例如:输入为'person'。它在单词列表中。这里没什么可做的。)

  2. 如果没有,请“折叠”它并查看是否:

    1. 它存在于您的单词列表中。如果是,请更换它。 (例如:'computerr'变为'computer'。现在您只需将其替换为列表中的原始字词。)
    2. 您的词典中存在一个键。如果是,请将其替换为与该键关联的单词。 (例如:'aaapppleee'成为'aple'。现在,您在单词列表中查找'aple'。它不存在。现在在字典中查找键'aple'。如果是那里。用它的值'apple'替换它。)
  3. 我用这种方法看到的唯一问题是两个有效的单词可能会“折叠”到同一个“单词”中。这意味着您必须使用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"]