Короткая версия заключается в том, что вы не можете использовать шаблоны переменной ширины в видовых окнах с помощью модуля Python re
. Нет способа изменить это:
>>> import re
>>> re.sub("(?<=foo)bar(?=baz)", "quux", "foobarbaz")
'fooquuxbaz'
>>> re.sub("(?<=fo+)bar(?=baz)", "quux", "foobarbaz")
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
re.sub("(?<=fo+)bar(?=baz)", "quux", string)
File "C:\Development\Python25\lib\re.py", line 150, in sub
return _compile(pattern, 0).sub(repl, string, count)
File "C:\Development\Python25\lib\re.py", line 241, in _compile
raise error, v # invalid expression
error: look-behind requires fixed-width pattern
Это означает, что вам нужно обойти это, самое простое решение очень похоже на то, что вы делаете сейчас:
>>> re.sub("(fo+)bar(?=baz)", "\\1quux", "foobarbaz")
'fooquuxbaz'
>>>
>>> # If you need to turn this into a callable function:
>>> def replace(start, replace, end, replacement, search):
return re.sub("(" + re.escape(start) + ")" + re.escape(replace) + "(?=" + re.escape + ")", "\\1" + re.escape(replacement), search)
Это не имеет элегантности решения для поиска за спиной, но это все еще очень четкая, простая однострочная. И если вы посмотрите на то, что эксперт должен сказать по этому вопросу (он говорит о JavaScript, в котором полностью отсутствуют взгляды, но многие принципы совпадают), вы увидите, что его простейшее решение выглядит очень похоже на это.