python限制重复字母

将重复字母限制为1和2的最佳方法是什么,例如:
appppppppple => aple和苹果
bbbbbeeeeeer => ber,啤酒,bber,bbeer

现在,我有这个:

a = "hellllllllllooooooooooooo"
    match = re.search('(.)\\1+',a)

    if match:
        print 'found'
        print re.sub('(.)\\1+','\\1',a)
        print re.sub('(.)\\1+','\\1\\1',a)
    else:
        print 'not found'

但它只会返回:

helo
helloo

我怎样才能让它按照我想要的方式工作?

解决方法

不要为此使用RE. RE适用于搜索,匹配和转换,但不适用于生成字符串.

我们可以将字符串视为向量;每个字母都是一个维度,重复计数是沿该维度的组件长度.给定向量V,您需要与V相同维度的所有可能向量,使得如果V的对应分量为1,则每个分量的值为1,否则为1或2.基于此,这是一个功能,可以做你想要的.

def doppelstring(s):
    letter_groups = ((val,list(group)) for val,group in itertools.groupby(s))
    max_vector = ((val,min(len(group),2)) for val,group in letter_groups)
    vector_components = ([dim * (l + 1) for l in range(maxlen)] for dim,maxlen in max_vector)
    return [''.join(letters) for letters in itertools.product(*vector_components)]

这是一个使用切片的更紧凑的版本.它的可读性可能稍差,但至少它保持在78-char范围内:

def doppelstring(s):
    max_vs = (''.join(itertools.islice(g,2)) for k,g in itertools.groupby(s))
    components = ([s[:l + 1] for l in range(len(s))] for s in max_vs)
    return [''.join(letters) for letters in itertools.product(*components)]

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...