<p>我不知道您的问题是什么,但是我发现重复<code>replace()</code>不是一件好事:如果这四个模式都在字符串中,那么将有4次创建一个新的字符串。在</p>
<p>在我看来,这应该更好:</p>
<pre><code>def fixStyle(self, text):
t = text.replace('<p>', '<p style="%s">' % (STYLEDEF,))
t = t.replace('class="wide"', 'style="width: 125px; %s"' % (STYLEDEF,))
t = t.replace('<td>', '<td style="%s">' % STYLEDEF)
t = t.replace('<a ', '<a style="%s" ' % (LINKSTYLE,))
return t
import re
STYLEDEF = 'stuff-from-styledef'
LINKSTYLE = 'VVVV'
def aux(m, dic = {'<p':('<p style="',STYLEDEF),
'<td':('<td style="',STYLEDEF),
'class="wide"':('style="width: 125px; ',STYLEDEF),
'<a':('<a style="',LINKSTYLE)} ):
return '%s%s"' % dic[m.group()]
pat = re.compile('<p(?=>)>|class="wide"|<td(?=>)|<a(?= )')
ch = '<table><tr><td>Test!</td></tr></table><a type="brown" >'
print ch
print fixStyle(None, ch)
print pat.sub(aux,ch)
</code></pre>
<p>结果</p>
^{pr2}$
<p>我认为<code>re.sub()</code>只对字符串执行一次替换。在</p>
<p>用默认参数定义参数dic=>;在<strong>aux()</strong>的定义中,该值被分配给<strong>dic</strong>,然后不再改变。在每次调用时,没有从外部级别将参数传递给<strong>dic</strong>:值保存在函数内部。在</p>
<p>另外,函数<strong>aux()</strong>不需要在函数外搜索STYLEDEF和LINKSTYLE的值。在</p>
<p>所有这些都会提高执行速度。在</p>
<p>一。在</p>
<p>编辑:
由于<code>' style="'</code>和<strong>STYLEDEF</strong>对于要返回的几个结果是常见的,所以我试图缩短它们的列表,我发现</p>
<pre><code>def aux(m, dic = {'<p' :'<p style="%s"',
'<td' :'<td style="%s"',
'class="wide"':'style="width: 125px; %s"'} ):
if m.group(1):
return '<a style="%s"' % LINKSTYLE
else:
return dic[m.group()] % STYLEDEF
pat = re.compile('<p(?=>)|class="wide"|<td(?=>)|(<a)(?= )')
</code></pre>
<p>为了去掉条件行,我写了前面的解决方案,我不知道为什么,我停在那里。解决方案的兴趣在于编写正则表达式字符串和断言,允许编写johnmachin的解决方案,但是我用这些oafish元组污染了它。在</p>
<p>还有一种解决方案:</p>
<pre><code>def aux(m, STY = STYLEDEF,LIN = LINKSTYLE ):
return ( 'style="width: 125px; ' if m.group(3) else m.group(1)+' style="' ) + \
( LIN if m.group(2) else STY) + '"'
pat = re.compile('(<p(?=>)|<td(?=>)|(<a(?= )))|(class="wide")')
</code></pre>
<p>但更清晰、更简单的解决方案是,正如John Machin所注意到的:</p>
<pre><code>def aux(m, dic = {'<p' :'<p style="%s"' % STYLEDEF,
'<td':'<td style="%s"' % STYLEDEF,
'<a' :'<a style="%s"' % LINKSTYLE,
'class="wide"':'style="%s"' % ('width: 125px; '+STYLEDEF) } ):
return dic[m.group()]
pat = re.compile('<p(?=>)|class="wide"|<td(?=>)|<a(?= )')
</code></pre>
<p><strong>dic</strong>中的值仅在执行函数<strong>aux()</strong>的定义时计算。在</p>
<p>实际上,它非常接近<code>replace()</code>函数的参数。在</p>