删除连续的字母重复项

时间:2011-07-18 13:15:30

标签: python string pattern-matching spell-checking

寻找一种快速方法,将重复数据限制在彼此旁边时最多为2。

例如:jeeeeeeeep => ['jep','jeep']

在python中寻找建议,但很高兴看到任何东西的例子 - 不难切换。

感谢您的帮助!

编辑:英语连续没有任何(或许多)辅音(同一个字母)吗?让我们限制这个,所以一行中没有重复的辅音,连续两个元音

EDIT2:我很傻(嘿,这个词有两个辅音),只是检查所有字母,限制彼此相邻的重复字母为两个。

5 个答案:

答案 0 :(得分:3)

这是使用groupby的递归解决方案。我已经把你希望能够重复的字符留给你了(但默认只有元音):

from itertools import groupby

def find_dub_strs(mystring):
    grp = groupby(mystring)
    seq = [(k, len(list(g)) >= 2) for k, g in grp]
    allowed = ('aeioupt')
    return rec_dubz('', seq, allowed=allowed)

def rec_dubz(prev, seq, allowed='aeiou'):
    if not seq:
        return [prev]
    solutions = rec_dubz(prev + seq[0][0], seq[1:], allowed=allowed)
    if seq[0][0] in allowed and seq[0][1]:
        solutions += rec_dubz(prev + seq[0][0] * 2, seq[1:], allowed=allowed)
    return solutions

这实际上只是一种启发式修剪深度优先搜索你可能的单词的“解决方案空间”。启发式是我们一次只允许一次重复,并且只有它是有效的可重复字母。你应该在最后得到2 ** n个单词,其中n是数字乘以你的字符串中重复的“允许”字符。

>>> find_dub_strs('jeeeeeep')
['jep', 'jeep']
>>> find_dub_strs('jeeeeeeppp')
['jep', 'jepp', 'jeep', 'jeepp']
>>> find_dub_strs('jeeeeeeppphhhht')
['jepht', 'jeppht', 'jeepht', 'jeeppht']

答案 1 :(得分:1)

使用正则表达式:

>>> import re
>>> re.sub(r'(.)\1\1+', r'\1\1', 'jeeeep')
'jeep'

答案 2 :(得分:1)

使用groupby的单个字符的解决方案:

>>> from itertools import groupby
>>> s = 'jeeeeeeeep'
>>> ''.join(c for c, unused in groupby(s))
'jep'

最多两个字符:

''.join(''.join(list(group)[:2]) for unused, group in groupby(s))

答案 3 :(得分:0)

这是一个Sh + Perl解决方案,我担心我不懂Python:

echo jjjjeeeeeeeeppppp | perl -ne 's/(.)\1+/\1\1/g; print $_;'

关键是找到(.)\1+并在全球范围内用\1\1替换它的正则表达式。

答案 4 :(得分:-1)

使用正则表达式和按键事件!