我正在尝试为 Look-and-Say 编写一个正则表达式python 中的序列。这个想法是将给定的字符串分割成相同数字的子字符串。经过反复试验,我得到了'((\d)\\2*)'
。
对于模式11244455221116
,这给出[('11', '1'), ('2', '2'), ('444', '4'), ('55', '5'), ('22', '2'), ('111', '1'), ('6', '6')]
如预期。这可行,但看起来很笨拙。有没有更干净的方法来做到这一点,无论有没有正则表达式?
您可以使用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
我是一名优秀的程序员,十分优秀!