Python 删除一行中的重复字母

Python 删除一行中的重复字母,python,string,pattern-matching,spell-checking,Python,String,Pattern Matching,Spell Checking,正在寻找一种快速方法,当重复项彼此相邻时,将其限制为最多2个 例如:jeeeeeep=>['jep','jeep'] 正在寻找python中的建议,但很高兴看到任何东西中的示例-不难切换 谢谢你的帮助 编辑:英语一行中没有任何(或许多)辅音(同一个字母),对吗?让我们限制这一点,以便一行中没有重复的辅音,一行中最多有两个元音 EDIT2:我很傻(嘿,那个词有两个辅音),只是检查所有字母,将相邻的重复字母限制为两个。在按键事件中使用正则表达式 这是一个Sh+Perl解决方案,我恐怕不懂Python

正在寻找一种快速方法,当重复项彼此相邻时,将其限制为最多2个

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

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

谢谢你的帮助

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


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

在按键事件中使用正则表达式

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

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

键是全局查找
()\1+
并替换为
\1\1
的正则表达式。

使用正则表达式:

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

下面是一个使用
groupby
的递归解决方案。我让您自己决定要重复哪些字符(不过默认为元音):

这实际上只是一个启发式的深度优先搜索到你的“解决方案空间”的可能的话。启发性的是,我们一次只允许一个重复,并且只有当它是一个有效的可重复字母时。最后应该有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']

使用
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))

你打算在程序中的什么时候限制它?当用户输入某物时还是之后?输入看起来像什么?只要一个单词或一个完整的字符串,可能有很多匹配项?jjjeeepppp的输出应该是什么?@elmugrat-这基本上是进入拼写检查程序,但不是在运行中,所以我会在按下“回车”键后修复它。既然你提到了它,我想将元音限制为两个,辅音限制为一个(这对英语来说是正确的,对吧?)seen@jphenow:这对元音应该没问题,但不要忘记像“correct”或“rabbit”这样的词一行中有多个相同的辅音。英语中有很多双辅音。
更好
检查你自己,哈哈。我认为他不想限制键盘输入。看我修改后的规则。试着将元音限制为两个,否则就不能重复。有意义吗?@jphenow:那么数字呢?他提出了1111,如果文本包含一个不经意地重复或重复的数字,那就考虑在那个情况下出错的电话号码。不要担心数字,而要修改关于辅音的陈述,只是担心所有的字母。这太棒了。当我回到我的计算器的时候,我会给它一个机会。r在家-愚蠢的实习办公室不允许ssh出去…@jphenow:没问题,谢谢你给我一个真正的计算机科学问题来解决,而不是“2如何用python制作矩阵??!”。
''.join(''.join(list(group)[:2]) for unused, group in groupby(s))