mirror of https://github.com/python/cpython
Temporary fix for Bug #114821.
The cause was that the replace code necessarily used a PCRE internal function to to template expansion. The fix changes the code to use an SRE internal if SRE is used, and a PCRE internal if SRE is used; in a way that should work with 1.5.2. The solution can be sped up tremendously under the assumption that the choice between sre and pre is not changed during the execution of the program; especially replace-all will be slow. But I'll leave that to someone else.
This commit is contained in:
parent
0eeba5b24b
commit
f8d071332a
|
@ -90,7 +90,7 @@ class ReplaceDialog(SearchDialogBase):
|
|||
line, m = res
|
||||
chars = text.get("%d.0" % line, "%d.0" % (line+1))
|
||||
orig = m.group()
|
||||
new = re.pcre_expand(m, repl)
|
||||
new = self._expand(m, repl)
|
||||
i, j = m.span()
|
||||
first = "%d.%d" % (line, i)
|
||||
last = "%d.%d" % (line, j)
|
||||
|
@ -142,7 +142,7 @@ class ReplaceDialog(SearchDialogBase):
|
|||
m = prog.match(chars, col)
|
||||
if not prog:
|
||||
return 0
|
||||
new = re.pcre_expand(m, self.replvar.get())
|
||||
new = self._expand(m, self.replvar.get())
|
||||
text.mark_set("insert", first)
|
||||
text.undo_block_start()
|
||||
if m.group():
|
||||
|
@ -154,6 +154,22 @@ class ReplaceDialog(SearchDialogBase):
|
|||
self.ok = 0
|
||||
return 1
|
||||
|
||||
def _expand(self, m, template):
|
||||
# XXX This code depends on internals of the regular expression
|
||||
# engine! There's no standard API to do a substitution when you
|
||||
# have already found the match. One should be added.
|
||||
# The solution here is designed to be backwards compatible
|
||||
# with previous Python versions, e.g. 1.5.2.
|
||||
# XXX This dynamic test should be done only once.
|
||||
if getattr(re, "engine", "pre") == "pre":
|
||||
return re.pcre_expand(m, template)
|
||||
else: # sre
|
||||
# XXX This import should be avoidable...
|
||||
import sre_parse
|
||||
# XXX This parses the template over and over...
|
||||
ptemplate = sre_parse.parse_template(template, m.re)
|
||||
return sre_parse.expand_template(ptemplate, m)
|
||||
|
||||
def show_hit(self, first, last):
|
||||
text = self.text
|
||||
text.mark_set("insert", first)
|
||||
|
|
Loading…
Reference in New Issue