Skip to content

Commit 02ea9b6

Browse files
committed
[GR-32537] Use TRegex's lastGroup property.
PullRequest: graalpython/2005
2 parents 3435642 + 6f1550f commit 02ea9b6

File tree

1 file changed

+16
-12
lines changed

1 file changed

+16
-12
lines changed

graalpython/lib-graalpython/_sre.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,14 @@ def setup(sre_compiler, error_class, flags_table):
176176

177177

178178
class Match():
179-
def __init__(self, pattern, pos, endpos, result, input_str, compiled_regex):
179+
def __init__(self, pattern, pos, endpos, result, input_str, compiled_regex, indexgroup):
180180
self.__result = result
181181
self.__compiled_regex = compiled_regex
182182
self.__re = pattern
183183
self.__pos = pos
184184
self.__endpos = endpos
185185
self.__input_str = input_str
186+
self.__indexgroup = indexgroup
186187

187188
def end(self, groupnum=0):
188189
return self.__result.getEnd(groupnum)
@@ -270,16 +271,16 @@ def endpos(self):
270271
@property
271272
def lastgroup(self):
272273
lastindex = self.lastindex
273-
if lastindex is not None:
274-
return self.__group(lastindex)
274+
if lastindex is not None and self.__indexgroup is not None and lastindex in self.__indexgroup:
275+
return self.__indexgroup[lastindex]
275276

276277
@property
277278
def lastindex(self):
278-
lastindex = None
279-
for index in range(1, self.__compiled_regex.groupCount):
280-
if self.__result.getStart(index) >= 0:
281-
lastindex = index
282-
return lastindex
279+
lastindex = self.__result.lastGroup
280+
if lastindex == -1:
281+
return None
282+
else:
283+
return lastindex
283284

284285
def __repr__(self):
285286
return "<%s object; span=%r, match=%r>" % (type(self).__name__, self.span(), self.group())
@@ -315,14 +316,17 @@ def __init__(self, pattern, flags):
315316
groups = compiled_regex.groups
316317
if groups is None:
317318
self.groupindex = {}
319+
self.__indexgroup = {}
318320
else:
319321
group_names = dir(groups)
320322
if isinstance(groups, __graalpython__.ForeignType):
321323
# tregex groups object
322324
self.groupindex = _mappingproxy({name: getattr(groups, name) for name in group_names})
325+
self.__indexgroup = {getattr(groups, name): name for name in group_names}
323326
else:
324327
# _sre._NamedCaptureGroups
325328
self.groupindex = _mappingproxy({name: groups[name] for name in group_names})
329+
self.__indexgroup = {groups[name]: name for name in group_names}
326330

327331
@property
328332
def flags(self):
@@ -408,7 +412,7 @@ def _search(self, pattern, string, pos, endpos, sticky=False):
408412
pattern = self.__tregex_compile(pattern, self.__flags_str + ("y" if sticky else ""))
409413
result = tregex_call_exec(pattern.exec, substring, pos)
410414
if result.isMatch:
411-
return Match(self, pos, endpos, result, string, pattern)
415+
return Match(self, pos, endpos, result, string, pattern, self.__indexgroup)
412416
else:
413417
return None
414418

@@ -444,7 +448,7 @@ def __finditer_gen(self, string, compiled_regex, substring, pos, endpos):
444448
if not result.isMatch:
445449
break
446450
else:
447-
yield Match(self, pos, endpos, result, string, compiled_regex)
451+
yield Match(self, pos, endpos, result, string, compiled_regex, self.__indexgroup)
448452
no_progress = (result.getStart(0) == result.getEnd(0))
449453
pos = result.getEnd(0) + no_progress
450454
return
@@ -465,7 +469,7 @@ def findall(self, string, pos=0, endpos=maxsize):
465469
elif group_count == 2:
466470
matchlist.append(self.__sanitize_out_type(string[result.getStart(1):result.getEnd(1)]))
467471
else:
468-
matchlist.append(tuple(map(self.__sanitize_out_type, Match(self, pos, endpos, result, string, compiled_regex).groups())))
472+
matchlist.append(tuple(map(self.__sanitize_out_type, Match(self, pos, endpos, result, string, compiled_regex, self.__indexgroup).groups())))
469473
no_progress = (result.getStart(0) == result.getEnd(0))
470474
pos = result.getEnd(0) + no_progress
471475
return matchlist
@@ -503,7 +507,7 @@ def subn(self, repl, string, count=0):
503507
if literal:
504508
result.append(repl)
505509
else:
506-
_srematch = Match(self, pos, -1, match_result, string, pattern)
510+
_srematch = Match(self, pos, -1, match_result, string, pattern, self.__indexgroup)
507511
_repl = repl(_srematch)
508512
result.append(_repl)
509513
pos = end

0 commit comments

Comments
 (0)