将重复字母限制为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)]