Python Look-And-Say Regex

时间:2013-07-25 21:53:10

标签: python regex

我正在尝试为python中的Look-and-Say序列编写一个正则表达式。我们的想法是将给定的字符串拆分为相同数字的子字符串。经过反复试验,我得'((\d)\\2*)'

对于模式11244455221116,这会按预期提供[('11', '1'), ('2', '2'), ('444', '4'), ('55', '5'), ('22', '2'), ('111', '1'), ('6', '6')]。这有效,但看起来很笨拙。有没有正则表达式,是否有更简洁的方法来做到这一点?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

而不是拆分你的字符串,你可以用lambda函数替换:

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

结果:2132141325