去除连续重复的字母
我在找一种快速的方法,来限制相邻的重复字符最多只能出现两次。
举个例子:jeeeeeeeep
变成 ['jep','jeep']
我希望能看到一些用Python写的建议,不过其他语言的例子也没问题,转换起来不难。
谢谢大家的帮助!
补充说明:英语中没有(或很少有)相同的辅音字母连续出现,对吧?所以我想限制一下,不让辅音字母连续出现,元音字母最多出现两个。
补充说明2:我真傻(嘿,这个词有两个辅音),其实是想检查所有字母,把相邻的重复字母限制在两个以内。
5 个回答
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))
1
使用正则表达式:
>>> import re
>>> re.sub(r'(.)\1\1+', r'\1\1', 'jeeeep')
'jeep'
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']