2013-07-25 25 views
1

我試圖在python中編寫Look-and-Say序列的正則表達式。這個想法是將給定的字符串拆分爲相同數字的子字符串。隨着試驗和錯誤,我有'((\d)\\2*)'python look-and-say正則表達式

對於11244455221116的模式,按照預期給出[('11', '1'), ('2', '2'), ('444', '4'), ('55', '5'), ('22', '2'), ('111', '1'), ('6', '6')]。這有效,但看起來笨拙。有沒有更好的方法來做到這一點,有沒有正則表達式?

+0

爲什麼它看起來笨拙?這是一個直截了當,非常簡單的正則表達式。 –

+0

正則表達式對我來說很好 - 替代(列表解析)會更笨重,恕我直言。 – tehsockz

回答

1

你可以使用itertools.groupby

import itertools as IT 

text = '11244455221116' 
print([(''.join(group), key) for key, group in IT.groupby(text)]) 

產生

[('11', '1'), ('2', '2'), ('444', '4'), ('55', '5'), ('22', '2'), ('111', '1'), ('6', '6')] 

re.findall更快:

In [67]: %timeit [(''.join(group), key)for key, group in IT.groupby(text*100)] 
1000 loops, best of 3: 528 us per loop 

In [68]: %timeit re.findall(r'((\d)\2*)', text*100) 
1000 loops, best of 3: 219 us per loop 
0

,而不是分裂的字符串,你可以做一個拉姆達一個替代功能:

re.sub(r'(\d)\1*', lambda x: str(len(x.group(0)))+x.group(1), '112224355') 

結果:2132141325