擅长:python、mysql、java
<p>我为此苦苦挣扎了一段时间,但我找到了一个我认为非常适合Python的解决方案:</p>
<pre><code>>>> def nth_matcher(n, replacement):
... def alternate(n):
... i=0
... while True:
... i += 1
... yield i%n == 0
... gen = alternate(n)
... def match(m):
... replace = gen.next()
... if replace:
... return replacement
... else:
... return m.group(0)
... return match
...
...
>>> re.sub("([0-9])", nth_matcher(3, "X"), "1234567890")
'12X45X78X0'
</code></pre>
<p><strong>编辑</strong>:匹配器由两部分组成:</p>
<ol>
<li><p><code>alternate(n)</code>函数。这将返回一个<a href="http://docs.python.org/tutorial/classes.html#generators" rel="nofollow">generator</a>,它返回一个无限序列True/False,其中每n个值都为True。把它想象成<code>list(alternate(3)) == [False, False, True, False, False, True, False, ...]</code>。</p></li>
<li><p><code>match(m)</code>函数。这是传递给<code>re.sub</code>的函数:它获取<code>alternate(n)</code>(<code>gen.next()</code>)中的下一个值,如果是<code>True</code>,它将替换匹配的值;否则,它将保持不变(用自身替换它)。</p></li>
</ol>
<p>我希望这足够清楚。如果我的解释不清楚,请说出来,我会改进的。在</p>