La version courte est que vous ne peut pas utiliser des motifs de largeur variable dans les transparents en utilisant l'outil Python re
module. Il n'y a aucun moyen de changer cela :
>>> 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
Cela signifie que vous devrez le contourner, la solution la plus simple étant très similaire à ce que vous faites actuellement :
>>> 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)
Cette solution n'a pas l'élégance de la solution lookbehind, mais elle reste très claire et directe. Et si vous regardez ce que l'avis d'un expert sur la question (il parle de JavaScript, qui est totalement dépourvu de lookbehinds, mais la plupart des principes sont les mêmes), vous verrez que sa solution la plus simple ressemble beaucoup à celle-ci.