python限制重复字母

2024-06-11 22:55:49 发布

您现在位置:Python中文网/ 问答频道 /正文

将重复字母限制为1和2的最佳方法是什么:
appppppple=>;苹果和苹果
bbbbb eeeeee r=>;ber,beer,bber,bber

现在,我有这个:

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'

但它只返回:

^{pr2}$

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


Tags: 方法gt苹果rematch字母printfound
3条回答
import re

def permute(seq):
    if len(seq) < 2:
        yield seq
    else:
        for tail in permute(seq[2:]):
            yield seq[:2] + tail
            yield seq[:2] + seq[1:2] + tail

text = "hellllllllllooooooooooooo"
seq = re.split('(.)\\1+', text)

for result in permute(seq):
    print ''.join(result)

不要用REs。REs有助于搜索、匹配和转换,但不适合生成字符串。在

我们可以把一个字符串看作一个向量;每个字母都是一个维度,而重复次数就是一个组件沿着该维度的长度。给定一个向量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个字符的限制范围内:

^{pr2}$

这是我脑海中第一个非正则表达式的方法

首先生成一个通用的squeeze函数:

def squeeze(str, chars='abcdefghijklmnopqrstuvwxyz', min=1): 
    new_str = str
    for c in chars:
        new_str = new_str.replace(c*(1+min),c*min)
    if new_str != str:
        new_str = squeeze(new_str, min=min)
    return new_str

>>> squeeze('aaaabbbbcccc')
'abc'
>>> squeeze('aaaabbbbcccc', min=2)
'aabbcc'

然后我们就可以编写一个小函数来生成每个“可压缩置换”,并可用于初始化set

^{pr2}$

相关问题 更多 >