我正在尝试为python中的Look-and-Say序列编写一个正则表达式。我们的想法是将给定的字符串拆分为相同数字的子字符串。经过反复试验,我得'((\d)\\2*)'
。
对于模式11244455221116
,这会按预期提供[('11', '1'), ('2', '2'), ('444', '4'), ('55', '5'), ('22', '2'), ('111', '1'), ('6', '6')]
。这有效,但看起来很笨拙。有没有正则表达式,是否有更简洁的方法来做到这一点?
答案 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