<p>尽管Wiktor给出了真正的python答案,但仍然有一个问题,为什么OP的原始算法不起作用。
基本上有两个问题:</p>
<p><code>new_content = re.sub(regex, repl_func(mobj), content)</code>的调用将用第一个匹配</em>的替换值替换<code>regex</code>的所有匹配</em>。你知道吗</p>
<p>正确的调用必须是<code>new_content = re.sub(regex, repl_func, content)</code>。
如文档所述<a href="https://docs.python.org/2/library/re.html" rel="nofollow noreferrer">here</a>,<code>repl_func</code>通过当前匹配对象动态调用!你知道吗</p>
<p><code>repl_func(mobj)</code>执行一些不必要的异常处理,可以简化:</p>
<pre><code>my_dict = {'\n': '', '+':'rep1', '*':'rep2', '/':'rep3', '-':'rep4'}
def repl_func(mobj):
global my_dict
return my_dict.get(mobj.group(0), '')
</code></pre>
<p>这相当于Wiktor的解决方案-他只是通过使用lambda表达式摆脱了函数定义本身。你知道吗</p>
<p>通过这种修改,<code>for mobj in re.finditer(regex, content):</code>循环变得多余,因为它多次执行相同的计算。你知道吗</p>
<p>为了完整起见,这里有一个使用<code>re.finditer()</code>的工作解决方案。它从<code>content</code>的<em>匹配切片</em>构建结果字符串:</p>
<pre><code>my_regx = r'[\n+*/-]'
my_dict = {'\n': '', '+':'rep1' , '*':'rep2', '/':'rep3', '-':'rep4'}
content = "A*B+C-D/E"
res = ""
cbeg = 0
for mobj in re.finditer(my_regx, content):
# get matched string and its slice indexes
mstr = mobj.group(0)
mbeg = mobj.start()
mend = mobj.end()
# replace matched string
mrep = my_dict.get(mstr, '')
# append non-matched part of content plus replacement
res += content[cbeg:mbeg] + mrep
# set new start index of remaining slice
cbeg = mend
# finally add remaining non-matched slice
res += content[cbeg:]
print (res)
</code></pre>