<p>要将出现<code>n</code>次的<strong>文本</strong>模式替换为重复<code>n/2</code>次的相同模式,可以执行以下操作:</p>
<pre><code>>>> import re
>>> text = 'aaaaaab'
>>> re.sub('aa', 'a', text)
'aaab'
</code></pre>
<p>如果模式不是一个文本匹配,这就不起作用,也没有办法让它只使用正则表达式。您可以使用<code>re.finditer</code>,并根据匹配中的信息将它们替换为所需的内容。你知道吗</p>
<p>例如,要替换为<code>n/2</code>次,可以执行以下操作:</p>
<pre><code>>>> text = 'aaaaaab something else aaaab'
>>> matches = list(re.finditer('a+', text))
>>> displ = 0
>>> for match in matches:
... num_repeat = match.end() - match.start() #depending on the pattern
... text = text[:match.start() - displ] + 'a' * (num_repeat // 2) + text[match.end() - displ:]
... displ += num_repeat // 2
...
>>> print text
aaab something else aab
</code></pre>
<p>或替换为<code>n-2</code>出现次数:</p>
<pre><code>>>> text = 'aaaaaab something else aaaab'
>>> matches = list(re.finditer('a+', text))
>>> displ = 0
>>> for match in matches:
... num_repeat = match.end() - match.start()
... text = text[:match.start() - displ] + 'a' * (num_repeat - 2) + text[match.end() - displ:]
... displ += 2
...
>>> print text
aaaab something else aab
</code></pre>