python限制重复字母

标签 python regex string

将重复字母限制为 1 和 2 的最佳方法是什么,例如:
appppppppple => 苹果和苹果
bbbbbeeeeeer => ber, beer, 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 个字符的限制内:

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)]

关于python限制重复字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6968346/

相关文章:

日期格式的java正则表达式提取错误信息

regex - 在 RegEx 中强制执行匹配顺序

ios - 如何在 Swift 中有效地将 Range Int 数组转换为 String 数组?

python - Django - 编写希伯来语字符串

Python:使用 SciPy 文档对 .csv 值执行 FFT

python - 使用 Python 的 Google-Forms 响应?

iphone - 从一个字符串中删除另一字符串中存在的字符

python - Golang : Get request sends me html contents but works fine from python and curl

MYSQL匹配csv关键字列

python - 通过向每个元素附加转义字符来替换列表的元素