擅长:python、mysql、java
<p>任何解决方案的关键都是将内容拆分为要重复的字符串对,并重复计数,然后在lock step中迭代这些对。在</p>
<p>如果您只需要单个字符字符串和个位数的重复计数,这只是将字符串分成两个字符对,您可以使用mshsayem的答案,或者使用切片(<code>s[::2]</code>是字符串,<code>s[1::2]</code>是计数)。在</p>
<p>但是如果你想把它推广到多字母字符串和多位数计数呢?在</p>
<p>好吧,不知怎么的,我们需要把字符串分为数字和非数字。如果我们能做到这一点,我们就可以像mshsayem的答案使用成对字符一样使用这些组对。在</p>
<p>结果证明我们可以很容易地做到这一点。在标准库中有一个很好的函数,叫做<a href="https://docs.python.org/3/library/itertools.html#itertools.groupby" rel="nofollow">^{<cd3>}</a>,它允许您根据任何函数将任何内容分组到运行中。还有一个函数<a href="https://docs.python.org/3/library/stdtypes.html#str.isdigit" rel="nofollow">^{<cd4>}</a>区分数字和非数字。在</p>
<p>我们想要的是:</p>
<pre><code>>>> import itertools
>>> s = 'd13fx4e2'
>>> [''.join(group) for (key, group) in itertools.groupby(s, str.isdigit)]
['d', '13', 'ff', '4', 'e', '2']
</code></pre>
<p>现在,我们用mshsayem压缩字符的方式压缩它:</p>
^{pr2}$
<p>所以:</p>
<pre><code>def expand(s):
groups = (''.join(group) for (key, group) in itertools.groupby(s, str.isdigit))
return ''.join(c*int(d) for (c, d) in zip(groups, groups))
</code></pre>