Понятия не имею, в чём ваша проблема, но я считаю, что повторение replace()
не очень хорошая вещь: если в строке четыре шаблона, будет создание новой строки в 4 раза.
ИМО, это должно быть лучше:
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)
результат
<table><tr><td>Test!</td></tr></table><a type="brown" >
<table><tr><td style="stuff-from-styledef">Test!</td></tr></table><a style="VVVV" type="brown" >
<table><tr><td style="stuff-from-styledef">Test!</td></tr></table><a style="VVVV" type="brown" >
Я думаю, re.sub()
выполняет замены только за один проход по строке.
Определение параметра dic с аргументом по умолчанию => значение присваивается dic при определении aux () и больше не изменяется , При каждом вызове не передается аргумент dic с внешнего уровня: значение сохраняется внутри функции.
Кроме того, функция aux () не должна выходить и искать значения STYLEDEF и LINKSTYLE, кроме функции.
Все это должно увеличить скорость выполнения.
.
EDIT:
Поскольку ' style="'
и STYLEDEF являются общими для нескольких возвращаемых результатов, я попытался сократить их список и обнаружил
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)(?= )')
Чтобы снять условные строки, я написал предыдущее решение и, я не знаю почему, я остановился на этом. Интерес решения заключался в написании строки регулярного выражения с утверждениями, позволяющими написать решение Джона Мачина, но я осквернил его этими тупыми кортежами.
Существует также это решение:
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")')
Но более ясное и простое решение, как заметил Джон Мачин:
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(?= )')
Значения в dic рассчитываются только при выполнении определения функции aux () .
На самом деле, это очень близко к аргументам функций replace()
.